首页 > 解决方案 > 使用 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 表?

标签: xmlxslt

解决方案


我猜(很难确定您的 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 示例,这将产生:

在此处输入图像描述


推荐阅读