XPATH具有未给定属性的节点数

时间:2018-12-22 17:15:57

标签: xml xpath

所以我想计算每个创作者对所有创作者有多少个视频。有人可以帮我吗?

<Video videoID="v0006" link="" creatorID="u0001" imageLink=""/>

我使用不同的creatorID多次重复此声明。

1 个答案:

答案 0 :(得分:0)

这可以通过使用带有for表达式和distinct-values(...)函数的XPath-3.0或更高版本来实现:

for $i in distinct-values(for $k in Video/@creatorID return $k) return concat('ID=',$i,', Count=',count(Video[@creatorID = $i]))

此表达式创建格式为ID=xxxx, Count=y的字符串。
例如,如果将其放在XSLT-3.0 xsl:value-of中,则可以通过以下方式输出所有以NEWLINE字符分隔的结果:

<xsl:value-of select="for $i in distinct-values(for $k in Video/@creatorID return $k) return concat('ID=',$i,', Count=',count(Video[@creatorID = $i]))" separator="&#xa;" />

例如XML文件的示例

<Video videoID="v0006" link="" creatorID="u0001" imageLink=""/>
<Video videoID="v0007" link="" creatorID="u0001" imageLink=""/>
<Video videoID="v0001" link="" creatorID="u0002" imageLink=""/>
<Video videoID="v0008" link="" creatorID="u0001" imageLink=""/>
<Video videoID="v0002" link="" creatorID="u0002" imageLink=""/>

其输出应为

ID=u0001, Count=3
ID=u0002, Count=2

如果要将输出限制为出现次数最少的ID,请使用IF-THEN-ELSE(此处带有LET以获得更好的性能)

for $i in distinct-values(for $k in Video/@creatorID return $k) return let $c := count(Video[@creatorID = $i]), $s := concat('ID=',$i,', Count=',$c) return if ($c>2) then $s else ''

输出:

ID=u0001, Count=3