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

时间:2013-02-24 11:44:56

标签: xml xslt xml-parsing xsd xslt-1.0

我在转换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,但我没有得到任何结果。我现在该怎么做?

感谢。

2 个答案:

答案 0 :(得分:3)

这似乎对我有用:

<?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>

答案 1 :(得分:2)

我使用此(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 

...并且还使用了更多列。

希望有所帮助!干杯