Вот еще одно решение, если вы не хотите рассчитывать или действовать на каждый элемент коллекции, но вы хотите рассчитывать / действовать только, если применяется определенное условие.
В этом случае вы можете вспомнить парадигму функционального программирования XQuery и реализовать этот подсчет / действие, используя рекурсивные вызовы функций:
declare function ActIf($collection as element(*)*, $index as xs:integer, $indexMax as xs:integer, $condition as xs:string, $count as xs:integer) as xs:integer
{
if($index <= $indexMax) then
let $element := $collection[$index]
if($element/xyz/text() eq $condition) then
(: here you can call a user-defined function before continuing to the next element :)
ActIf($collection, $index + 1, $indexMax, $condition, $count + 1)
else
ActIf($collection, $index + 1, $indexMax, $condition, $count)
else (: no more items left:)
$count
};
Более простым способом было бы использование соответствующего выражения XPath:
for $element at $count in $collection[xyz = $condition]
return
(: call your user-defined function :)
или даже
myFunction($collection[xyz = $condition])
Рекурсивное решение может быть весьма полезным, если вы хотите реализовать что-то более сложное с XQuery ...