Подсчитать количество слов в каждом атрибуте - PullRequest
0 голосов
/ 16 ноября 2018

Как мне подсчитать количество слов в определенном атрибуте для каждого элемента?

Пример: я хочу посчитать, сколько городов имеет каждая страна, и города имеют такие атрибуты: мир / страна / [@ города]. Затем я хочу отобразить его в виде нового списка, в котором отображается каждая страна и количество городов, которые есть в каждой стране.

Я пробовал это:

for $country in doc("world.xml")/world/country
let $neighbors := tokenize($country/@cities, '\s+')
let $count := count($neighbors)
order by $count
return ($country/name, $count)

Но как мне получить максимальное количество?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Догадываясь из вашего кода, я думаю max с for должно работать с использованием XPath 2.0 +

max(for $country in doc("world.xml")/world/country
    return count(tokenize($country/@cities, '\s+')))

, а затем выбрать соответствующие узлы

/world/country[count(tokenize(@cities, '\s+')) = max(for $country in /world/country
    return count(tokenize($country/@cities, '\s+')))]
0 голосов
/ 16 ноября 2018

Существует несколько подходов. После того, как вы приступили к его логическому завершению, вы уже упорядочили свои элементы по $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)]
...