如何在XSLT的节点计数不同的值?
例如:我想指望现有的国家在国家节点的数量,在这种情况下,这将是3。
<Artists_by_Countries>
<Artist_by_Country>
<Location_ID>62</Location_ID>
<Artist_ID>212</Artist_ID>
<Country>Argentina</Country>
</Artist_by_Country>
<Artist_by_Country>
<Location_ID>4</Location_ID>
<Artist_ID>108</Artist_ID>
<Country>Australia</Country>
</Artist_by_Country>
<Artist_by_Country>
<Location_ID>4</Location_ID>
<Artist_ID>111</Artist_ID>
<Country>Australia</Country>
</Artist_by_Country>
<Artist_by_Country>
<Location_ID>12</Location_ID>
<Artist_ID>78</Artist_ID>
<Country>Germany</Country>
</Artist_by_Country>
</Artists_by_Countries>
如果你有一个大的文件,你可能想使用“Muenchian法”,它通常用于分组,以识别不同的节点。 声明索引你想通过是不同的值来计算的事情的关键:
<xsl:key name="artists-by-country" match="Artist_by_Country" use="Country" />
然后你就可以得到<Artist_by_Country>
有使用不同国家的要素:
/Artists_by_Countries
/Artist_by_Country
[generate-id(.) =
generate-id(key('artists-by-country', Country)[1])]
您可以通过包装,在该通话尽数count()
函数。
当然,在XSLT 2.0,它的那样简单
count(distinct-values(/Artists_by_Countries/Artist_by_Country/Country))
在XSLT 1.0,这不是很明显,但下面应该给你的需求的想法:
count(//Artist_by_Country[not(Location_ID=preceding-sibling::Artist_by_Country/Location_ID)]/Location_ID)
在你的XML元素越多越长这需要的,因为它会检查每一个元素的每一个前置兄弟。
尝试是这样的:
count(//Country[not(following::Country/text() = text())])
“给我所有国家节点的数量没有跟着国家相匹配的文本”
该表达式的有趣位,IMO,是以下轴线。
你也许还删除第一个/text()
并替换为第二.
如果你对一个国家中第一次出现的XML生成的控制,你可以添加到国家节点的属性,例如不同的=“真正的”标志的国家为“使用”,如果你遇到的是不是后来添加的不同属性再次的国家。
那么你可以做
<xsl:for-each select="Artists_by_Countries/Artist_by_Country/Country[@distinct='true']" />