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了,有人建议使用 a template,但我没有得到任何结果。我现在该怎么办?

谢谢。

4

2 回答 2

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>
于 2013-02-24T11:52:20.530 回答
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 

... and worked with more columns too.

Hope that helps! Cheers

于 2013-02-24T12:05:51.950 回答