/ / Як я можу знати, яке місто є найбільш населеним у цій XML? - xml, xquery, xquery-3.0

Як я можу дізнатись, яке саме найпопулярніше місто в цьому XML? - xml, xquery, xquery-3.0

У мене такий XML:

<countries>
<country name="Austria" population="8023244" area="83850">
<city>
<name>Vienna</name>
<population>1583000</population>
</city>
</country>
<country name="Spain" population="39181112" area="504750">
<city>
<name>Madrid</name>
<population>3041101</population>
</city>
</country>
[...]
</countries>

Мені потрібен вираз xQuery, щоб отримати ім'я найбільш населеного міста, але я не знаю, як це зробити. Якісь ідеї?

Відповіді:

1 для відповіді № 1

Ну, виберіть city елементів, виберіть максимальне населення, а потім місто з цим населенням, наприклад:

let $cities := //city,
$max-pob := max($cities/population)
return $cities[population = $max-pob]/name

Або сортуйте та візьміть перше:

(for $city in //city
order by $city/population descending
return $city)[1]/name

Ви також можете скористатись sort функція:

sort(//city, (), function($c) { xs:decimal($c/population) })[last()]/name

1 для відповіді № 2

Традиційним способом у XQuery 1.0 є

let $p := max(//population)
return //city[population = $p]/name

Але це має недолік сканування даних двічі.

Ви можете уникнути цього за допомогою функцій вищого порядку, наприклад, наприклад: функція: найвищий (), показаний як приклад у специфікації на D4.6.1 (https://www.w3.org/TR/xpath-functions-31/#highest-lowest) або операція складання:

let $top := fold-left(//city, head(//city),
function($top, $this) {
if (number($this/population) ge number($top/population))
then $this else $top
})
return $top/name

Saxon забезпечує функцію розширення saxon: найвища, що еквівалентно напр .: найвищий приклад у специфікації, тому ви можете писати

saxon:highest(//city, function($city){number($city/population)})/name

0 для відповіді № 3

Ви можете спробувати це:

//city[population = max(/countries/country/city/population)]/name