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