/ / Comment puis-je savoir quelle est la ville la plus peuplée de ce XML? - xml, xquery, xquery-3.0

Comment savoir quelle est la ville la plus peuplée de ce XML? - xml, xquery, xquery-3.0

J'ai un XML comme celui-ci:

<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>

J'ai besoin d'une expression xQuery pour obtenir le nom de la ville la plus peuplée, mais je ne sais pas comment faire. Quelques idées?

Réponses:

1 pour la réponse № 1

Eh bien, sélectionnez le city éléments, sélectionnez la population maximale, puis la ville avec cette population, par exemple:

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

Ou triez et prenez le premier:

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

Vous pouvez également utiliser le sort fonction:

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

1 pour la réponse № 2

La méthode traditionnelle dans XQuery 1.0 est

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

Mais cela présente l’inconvénient de scanner les données deux fois.

Vous pouvez éviter cela en utilisant des fonctions d'ordre supérieur, par exemple la fonction eg: most (most) (montrée à titre d'exemple dans la spécification de D4.6.1 (https://www.w3.org/TR/xpath-functions-31/#highest-lowest) ou une opération de pliage:

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 fournit une fonction d’extension saxon: most qui équivaut à l’exemple exemple: plus élevé dans la spécification, afin que vous puissiez écrire

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

0 pour la réponse № 3

Vous pouvez essayer ceci:

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