如何计算中的一个节点不同的值?(How to count distinct values in a

2019-07-21 06:46发布

如何在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>

Answer 1:

如果你有一个大的文件,你可能想使用“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))


Answer 2:

在XSLT 1.0,这不是很明显,但下面应该给你的需求的想法:

count(//Artist_by_Country[not(Location_ID=preceding-sibling::Artist_by_Country/Location_ID)]/Location_ID)

在你的XML元素越多越长这需要的,因为它会检查每一个元素的每一个前置兄弟。



Answer 3:

尝试是这样的:

count(//Country[not(following::Country/text() = text())])

“给我所有国家节点的数量没有跟着国家相匹配的文本”

该表达式的有趣位,IMO,是以下轴线。

你也许还删除第一个/text()并替换为第二.



Answer 4:

如果你对一个国家中第一次出现的XML生成的控制,你可以添加到国家节点的属性,例如不同的=“真正的”标志的国家为“使用”,如果你遇到的是不是后来添加的不同属性再次的国家。

那么你可以做

<xsl:for-each select="Artists_by_Countries/Artist_by_Country/Country[@distinct='true']" />


文章来源: How to count distinct values in a node?