xml - 使用 XSLT 转换 nxm XML 表
问题描述
在我的应用程序中,我收到一个 XML 表,其中包含我想用 XSLT 转换到的可变列数。该表具有以下结构:
我尝试使用以下 XSLT 对其进行转换
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:Informe xmlns:ns2="http://whateverUrl/" idOperacion="123456">
<Resultset identificador="0" nombre="Nombre" numResult="1">
<Header>
<Columna tipo="VARCHAR">ColName1</Columna>
<Columna tipo="VARCHAR">ColName2</Columna>
<Columna tipo="VARCHAR">ColName3</Columna>
<Columna tipo="VARCHAR">ColName4</Columna>
<Columna tipo="VARCHAR">ColName5</Columna>
<Columna tipo="VARCHAR">ColName6</Columna>
</Header>
<DataSet>
<Fila>
<Campo>Val1</Campo>
<Campo>Val2</Campo>
<Campo>Val3</Campo>
<Campo>Val4</Campo>
<Campo>Val5</Campo>
<Campo>Val6</Campo>
</Fila>
</DataSet>
</Resultset>
</ns2:Informe>
</S:Body>
</S:Envelope>
我尝试使用以下 XSLT 对其进行转换:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="S:Envelope/S:Body/ns2:Informe/">
<html>
<body>
<h2>My Title</h2>
<table border="1">
<thead>
<xsl:for-each select="/Resultset/Header/Columna">
<tr>
<th><xsl:value-of select="name()"/></th>
</tr>
</xsl:for-each>
</thead>
<tbody>
<xsl:for-each select="/Resultset/DataSet/Fila">
<tr>
<td><xsl:value-of select="name()"/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
我用我的转换方法发现的问题是: -template match
没有进入 XML 的指定元素。<td><xsl:value-of select="name()"/></td>
-我所做的其他试用中的 value-of打印了“Columna”,而不是 Column 元素内的值。
因此,我的问题是:鉴于我的方法中已识别(和未解决的)错误,我到底做错了什么,不允许我用这个 XSLT 转换这个 NXM 输入 XML 表?
解决方案
我猜(很难确定您的 XML 示例何时只有一行数据)您想要做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns2="http://whateverUrl/">
<xsl:template match="/S:Envelope">
<html>
<body>
<h2>My Title</h2>
<table border="1">
<thead>
<tr>
<xsl:for-each select="S:Body/ns2:Informe/Resultset/Header/Columna">
<th>
<xsl:value-of select="."/>
</th>
</xsl:for-each>
</tr>
</thead>
<tbody>
<xsl:for-each select="S:Body/ns2:Informe/Resultset/DataSet/Fila">
<tr>
<xsl:for-each select="Campo">
<td>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
应用于给定的 XML 示例,这将产生:
推荐阅读
- java - 如何让我的哨兵脱离循环?
- javascript - Sinon js AssertError:预期存根被调用一次,但被调用了 0 次
- javascript - 我们如何使用 window.open 打开多个 javascript: url 窗口?
- python - 如何在 Python 中更有效地构造变量?
- python - 结合 pandas DataFrames 以提供唯一的元素计数
- wix - Wix ICE32:可能未对齐的外键
- python - Code Fight findClosestPair没有返回总和之间的正确距离
- javascript - 防止 iframe 加载的特定 JS 在我的网站上运行
- r - R DBI::dbSendQuery 的更多信息?
- javascript - 默认对象属性