XPATH подсчитывает количество узлов с не заданным атрибутом - PullRequest
0 голосов
/ 22 декабря 2018

Итак, я хотел посчитать, сколько видео было у каждого создателя для всех создателей.Кто-нибудь может мне помочь?

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

Я повторяю это заявление несколько раз с другим creatorID.

1 Ответ

0 голосов
/ 22 декабря 2018

Это возможно при использовании 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="&#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

Если вы хотите ограничить вывод идентификаторами, которые имеют определенный минимум вхождений, используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...