0

我有一个 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>
4

1 回答 1

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>
于 2013-05-24T15:33:44.130 回答