使用XSLT动态地将XML转换为HTML选项卡

时间:2013-05-24 14:58:39

标签: html xml xslt

我有一个xml,如

<data key="xxx" value="xxxx">
<data key="xxx" value="xxxx">
...
<test> // a test object = a line in html table
    <data key="X1" value="1">// 1td
    <data key="X2" value="2">// 1td
    <data key="X3" value="3">// 1td
    <data key="X4" value="4">// 1td
</test>
<test>// a test object = a line in html table
    <data key="X1" value="7">// 1td 
    <data key="X2" value="8">// 1td
    <data key="X4" value="9">// 1td
</test>[....]

我想要做的是在html表中表示所有元素(不是外部元素)中的数据字段,使用数据键作为HTML标签页,其中每行=一个键。

我的问题是这些键是动态的(我事先不知道它们)。但是,所有元素的键都是相同的,但是某些键可以为null,而不是在xml中,例如在示例中。

你将如何获得诸如

之类的结果
<table>
    <tr> //my header tr data
        <td>x1</td>
        <td>x2</td>
        <td>x3</td>
        <td>x4</td>
    </tr>
    <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
        <td>4</td>
    </tr>
    <tr>
        <td>7</td>
        <td>8</td>
        <td></td> //nothing here because no value present
        <td>9</td>
    </tr>
</table>

1 个答案:

答案 0 :(得分:0)

这是一个经典的muenchian分组:

试试这个:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="xml" indent="yes" />
    <xsl:key name="kDataKey" match="test/data" use="@key" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="test" >
        <xsl:variable name="e" select="."/>
        <tr>
            <xsl:for-each select="//test/data[count(. |  key('kDataKey', @key )[1] ) = 1]" >
                <td>
                    <xsl:value-of select="$e/data[@key = current()/@key]/@value"/>
                </td>
            </xsl:for-each>
        </tr>
    </xsl:template>

    <xsl:template match="/*">
        <table>
            <tr>
                <xsl:for-each select="//test/data[count(. |  key('kDataKey', @key )[1] ) = 1]" >
                    <td>
                        <xsl:value-of select="@key"/>
                    </td>
                </xsl:for-each>
            </tr>
            <xsl:apply-templates select="//test" />
        </table>
    </xsl:template>

</xsl:stylesheet>

将生成以下输出:

<?xml version="1.0"?>
<table>
  <tr>
    <td>X1</td>
    <td>X2</td>
    <td>X3</td>
    <td>X4</td>
  </tr>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
  </tr>
  <tr>
    <td>7</td>
    <td>8</td>
    <td/>
    <td>9</td>
  </tr>
</table>

输入xml:

<?xml version="1.0" encoding="utf-8" ?>
<xml>
    <data key="xxx" value="xxxx"/>
    <data key="xxx" value="xxxx"/>
    ...
    <test>
        <data key="X1" value="1"/>
        <data key="X2" value="2"/>
        <data key="X3" value="3"/>
        <data key="X4" value="4"/>
    </test>
    <test>
        <data key="X1" value="7"/>
        <data key="X2" value="8"/>
        <data key="X4" value="9"/>
    </test>
</xml>