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

これは、古典的なムエンチャンのグループ化です。

これを試して:

<?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 に答える