所以我想计算每个创作者对所有创作者有多少个视频。有人可以帮我吗?
<Video videoID="v0006" link="" creatorID="u0001" imageLink=""/>
我使用不同的creatorID多次重复此声明。
答案 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="
" />
例如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