Существует несколько подходов. После того, как вы приступили к его логическому завершению, вы уже упорядочили свои элементы по $count
, так что вы можете связать эти упорядоченные элементы с переменной и получить самый лучший из них с помощью функции fn:last()
. Вы не предоставили исходные данные, поэтому вот полный пример, демонстрирующий подход:
xquery version "3.1";
let $people :=
<people>
<person age="42" name="molly"/>
<person age="70" name="lucy"/>
<person age="9" name="billy"/>
</people>
let $ordered :=
(
for $person in $people/person
order by $person/@age cast as xs:integer
return
$person
)
let $oldest := $ordered[last()]
return
$oldest
Это вернет запись Люси. (Если бы мы не произвели значения как xs:integer
, мы бы получили Билли.)
Однако возможно, что будут два или более человека, которые имеют одинаковый наибольший возраст. Чтобы вернуть все записи с максимальным возрастом, вы можете сначала найти максимальное значение, а затем выбрать элементы с этим значением:
xquery version "3.1";
let $people :=
<people>
<person age="42" name="molly"/>
<person age="70" name="lucy"/>
<person age="9" name="billy"/>
<person age="70" name="holly"/>
</people>
let $ages := $people/person/@age
let $max := max($ages)
let $oldest := $people/person[@age = $max]
return
$oldest
Это вернет записи Люси и Холли. (В этом случае нам не нужно было приводить значения как целые, потому что функция fn:max()
приводит все значения типа xs:anyAtomicType
к xs:double
; см. https://www.w3.org/TR/xpath-functions-31/#func-max.)
Или, в более компактной форме:
xquery version "3.1";
let $people :=
<people>
<person age="42" name="molly"/>
<person age="70" name="lucy"/>
<person age="9" name="billy"/>
<person age="70" name="holly"/>
</people>
return
$people/person[@age = max($people/person/@age)]