使用XSLT将XML结构转换为TABLE TR TD



我在转换XML结构时遇到问题:

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="ceva.xsl"?>
<!-- Edited by XMLSpy® -->
<reports>
    <report_head>
        <value>product_id</value>
        <value>product_name</value>
    </report_head>
    <report_data>
        <value>1</value>
        <value>PRODUCT NAME NO 43</value>
    </report_data>
    <report_data>
        <value>2</value>
        <value>PRODUCT NAME NO 56</value>
    </report_data>
    <report_data>
        <value>3</value>
        <value>PRODUCT NAME NO 65</value>
    </report_data>
</reports>

进入类似的表格

<table>
    <tr>
        <td>product_id</td>
        <td>product_name</td>
    </tr>
    <tr>
        <td>1</td>
        <td>PRODUCT NAME NO 43</td>
    </tr>
    <tr>
        <td>2</td>
        <td>PRODUCT NAME NO 56</td>
    </tr>
    <tr>
        <td>3</td>
        <td>PRODUCT NAME NO 65</td>
    </tr>
</table>

这是我正在使用的XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
        <body>
        <h2>Transform a table</h2>
        <!--
        <table border="1">
            <tr>
                <xsl:for-each select="reports/report_head/value">
                    <td><xsl:value-of select="."/></td>
                </xsl:for-each>
            </tr>

            <xsl:for-each select="reports/report_data/value">
            <tr>
                <td><xsl:value-of select="."/></td>
            </tr>
            </xsl:for-each>
        </table>
        -->
        <table border="1">
            <tr>
            <xsl:apply-templates/>
            </tr>
        </table>
        </body>
        </html>
    </xsl:template>
    <!--
    <xsl:template match="value">
        <tr>
            <td><xsl:value-of select="."/></td>
        </tr>
    </xsl:template>
    </table>
    -->
    <xsl:template match="value">
        <td>
        <xsl:value-of select="."/>
        </td>
    </xsl:template>
</xsl:stylesheet>

但是等等,还有更多,我不知道有多少列。一个典型的报告可能有10列,但可能有20、30多列,因此xslt必须动态地执行此操作。

我尝试过for-each,有人建议使用template,但我没有得到任何结果。我现在该怎么办?

谢谢。

这似乎对我有效:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
        <body>
        <h2>Transform a table</h2>
        <table border="1">
            <xsl:apply-templates/>
        </table>
        </body>
        </html>
    </xsl:template>
    <xsl:template match="report_data | report_head">
        <tr>
          <xsl:apply-templates/>
        </tr>
    </xsl:template>
    <xsl:template match="value">
        <td>
        <xsl:value-of select="."/>
        </td>
    </xsl:template>
</xsl:stylesheet>

我使用了这个(http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog)快速原型设计的小工具(请参阅http://www.w3schools.com/xsl/default.asp了解更多)。如果我理解得对的话,我想这就行了:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
  <body>
    <h2>Transform a table</h2>
    <table border="1">
      <tr>
        <xsl:for-each select="reports/report_head/value">
          <td><xsl:value-of select="."/></td>
        </xsl:for-each>
      </tr>
      <xsl:for-each select="reports/report_data">
      <tr> 
        <xsl:for-each select="./value">
          <td><xsl:value-of select="."/></td>
        </xsl:for-each>
      </tr>
      </xsl:for-each>
    </table>
  </body>
</html>
</xsl:template>
</xsl:stylesheet>

编辑#1:修复错误放置的</tr>

它生成了这个表。。。

product_id  product_name 
1           PRODUCT NAME NO 43 
2           PRODUCT NAME NO 56 
3           PRODUCT NAME NO 65 

并且还处理了更多的列。

希望能有所帮助!干杯

最新更新