Это возможно при использовании XPath-3.0 или выше с выражением for
и функцией distinct-values(...)
:
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
Если вы хотите ограничить вывод идентификаторами, которые имеют определенный минимум вхождений, используйте 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