我有这个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
我想在整个文档中选择
<e>
和<z>
的值和对它们进行排序,没有任何重复项
我建议您使用Muenchian分组方法来消除重复。这比您尝试的方法要有效得多——而且排序也会变得相当琐碎(除了只按值的数字部分排序的问题):
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>
当祖先的子
<b>
时,我只想列出<e>
项<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时 "。