我正在尝试解析是xml
<a>
<b Number="first">
<c Over="1">
<name>1</name>
</c>
<c Over="2">
<name>2</name>
</c>
</b>
<b Number="Second">
<c Over="1">
<name>3</name>
</c>
<c Over="2">
<name>4</name>
</c>
</b>
</a>
使用分组概念
我喜欢这个
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
<xsl:key name="node-by-over" match="c" use="@Over" />
<xsl:template match="a">
<xsl:apply-templates select="b[@Number='first']/c[generate-id() = generate-id(key('node-by-over', @Over)[1])]"/>
</xsl:template>
<xsl:template match="c">
<table id="">
<xsl:for-each select="key('node-by-over', @Over)">
<tr>
<td>balls:::<xsl:value-of select="name"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
我的输出
<table><tr><td>balls:::1</td></tr><tr><td>balls:::3</td></tr></table><table><tr><td>balls:::2</td></tr><tr><td>balls:::4</td></tr></table>
预期
<table><tr><td>balls:::1</td></tr><tr><td>balls:::2</td></tr></table>
为什么它给出这样的输出1,3,2,4 ???我已经在applytemplate
中使用了提及我需要@Number为c
的所有first
节点
<xsl:apply-templates select="b[@Number='first']/c[generate-id() = generate-id(key('node-by-over', @Over)[1])]"/>
预期输出1,2(解析名称)
答案 0 :(得分:0)
您的预期输出表明您想要:
c/name
元素
(由Over
属性分组),<table>
元素中。(您应该在帖子中写上以上内容)。
因此,对脚本的重要更改归结为以下内容:
<table>
移至match="a"
模板。<xsl:for-each
模板中的match="c"
(以生成输出
只是当前组中的第一个元素。)这是完整的脚本:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="node-by-over" match="c" use="@Over" />
<xsl:template match="a">
<table>
<xsl:apply-templates select=
"b[@Number='first']/c[generate-id() =
generate-id(key('node-by-over', @Over)[1])]"/>
</table>
</xsl:template>
<xsl:template match="c">
<tr><td>balls:::<xsl:value-of select="name"/></td></tr>
</xsl:template>
</xsl:stylesheet>
实际上[@Number='first']
中不需要select
,因为分组只选择每个组中的第一个c/name
元素(从整个文档中收集)。
或者,如果某些其他机制已经分组了元素(进入第一个和
第二个组,可能更多),然后整个分组基于key
不需要。
也许只需select="b[@Number='first']"
即可。