我有这个xml代码,我想在整个文档中选择<e>
和<z>
值,并对它们进行排序而不重复:
<root>
<a>
<b>2.7</b>
<c>
<d>
<e>NZ 5222</e>
</d>
<d>
<e>NZ 5223</e>
</d>
<d>
<e>NZ 5224</e>
</d>
<d>
<e>NZ 5225</e>
</d>
</c>
</a>
<a>
<b>2.7</b>
<c>
<d>
<e>NZ 5222</e>
</d>
<d>
<e>NZ 611</e>
</d>
<d>
<e>NZ 54</e>
</d>
<d>
<e>NZ 522</e>
</d>
</c>
</a>
<a>
<x>
<y>
<z>NZ 5222</z>
</y>
<y>
<z>NZ 677</z>
</y>
</x>
</a>
</root>
这个XSL样式表:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match='/'>
<xsl:variable name="unique-list" select="//e[ancestor::a/b='2.7' and not(.=following::e)]" />
<xsl:variable name="unique-list2" select="//z[not(.=following::z)]" />
<xsl:for-each select="$unique-list">
<xsl:value-of select="." />
<br/>
</xsl:for-each>
<xsl:for-each select="$unique-list2">
<xsl:value-of select="." />
<br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
输出是:
NZ 5222
NZ 5223
NZ 5224
NZ 5225
NZ 5222
NZ 611
NZ 54
NZ 522
NZ 5222
NZ 677
所需的排序输出,没有任何重复:
NZ 54
NZ 522
NZ 611
NZ 677
NZ 5222
NZ 5223
NZ 5224
NZ 5225
答案 0 :(得分:1)
我想在整个文档中选择
<e>
和<z>
值 对它们进行排序,没有任何重复
我建议您使用Muenchian grouping方法来消除重复项。这比你的atttempted方法更有效 - 并且排序也将变得相当微不足道(除了仅通过值的数字部分排序的问题):
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:key name="k" match="e | z" use="." />
<xsl:template match="/root">
<xsl:for-each select="(a/c/d/e | a/x/y/z)[count(. | key('k', .)[1]) = 1]">
<xsl:sort select="substring-after(., ' ')" data-type="number" order="ascending"/>
<xsl:value-of select="." />
<br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我只想在祖先的孩子
<e>
中列出<b>
项<a>
等于2.7
然后改变:
<xsl:for-each select="(a/c/d/e | a/x/y/z )[count(. | key('k', .)[1]) = 1]">
为:
<xsl:for-each select="(a[b=2.7]/c/d/e | a/x/y/z )[count(. | key('k', .)[1]) = 1]">
请注意,当祖先<b>
的任何子<a>
等于2.7 &#34;时,这意味着&#34; 。