XSL - 如何使用多个同名元素从XML创建表

时间:2018-04-18 15:11:09

标签: html xml xslt html-table

我想创建一个看起来像这样的表:

Table

来自这个典型的XML文件

<test>
<criteria nom="DR">
    <abbr>DR</abbr>
    <value>0.123456</value>
    <value>0.134679</value>
    <value>0.976431</value>
    <rating></rating>
</criteria>
<criteria nom="MOTA">
    <abbr>MOTA</abbr>
    <value>0.132465</value>
    <value>0.321645</value>
    <value>0.649715</value>
    <rating></rating>
</criteria>
<criteria nom="PFR">
    <abbr>PFR</abbr>
    <value>0.914375</value>
    <value>0.467985</value>
    <value>0.162356</value>
    <rating></rating>
</criteria>
</test>

但我无法想象如何做到这一点。 用Google搜索并在此处搜索stackoverflow但没有成功。

我创建表的代码目前如下所示:

<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">

    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
            <title>YAML</title>
        </head>

        <body>
            <table width="1000" border="1" cellspacing="0" cellpadding="0">
            <tr>
                <xsl:for-each select="test/criteria">
                    <th scope="col"><xsl:value-of select="@nom" /></th>
                </xsl:for-each>
            </tr>

            <xsl:for-each select="test/criteria/value">
                <tr>
                        <td><xsl:value-of select="text()"/></td>
                </tr>
            </xsl:for-each>
            </table>

        </body>
    </html>

</xsl:template>

但此代码的当前输出如下: current table 我怎样才能做到这一点? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

试试这个:

<xsl:for-each select="test/criteria">
    <tr>
        <xsl:for-each select="value">
            <td><xsl:value-of select="text()"/></td>
        </xsl:for-each>
    </tr>
</xsl:for-each>

取代:

<xsl:for-each select="test/criteria/value">
    <tr>
        <td><xsl:value-of select="text()"/></td>
    </tr>
</xsl:for-each>

答案 1 :(得分:1)

尝试将xsl:for-each上的当前test/criteria/value更改为此..

<xsl:for-each select="test/criteria[1]/value">
    <xsl:variable name="pos" select="position()" />
    <tr>
        <xsl:for-each select="/test/criteria/value[$pos]">
            <td><xsl:value-of select="text()"/></td>
        </xsl:for-each>
    </tr>
</xsl:for-each>

也就是说,只选择第一个条件中的value元素,获取位置,然后获取在该位置发生的所有条件value元素,因为它们是构成您的位置的元素行。

请注意,这确实假设所有criteria具有相同数量的value个节点。

完整的XSLT ....

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
            <title>YAML</title>
        </head>

        <body>
            <table width="1000" border="1" cellspacing="0" cellpadding="0">
            <tr>
                <xsl:for-each select="test/criteria">
                    <th scope="col"><xsl:value-of select="@nom" /></th>
                </xsl:for-each>
            </tr>

            <xsl:for-each select="test/criteria[1]/value">
                <xsl:variable name="pos" select="position()" />
                <tr>
                    <xsl:for-each select="/test/criteria/value[$pos]">
                        <td><xsl:value-of select="text()"/></td>
                    </xsl:for-each>
                </tr>
            </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>