/ / Woher weiß ich, welche Stadt in dieser XML am dichtesten besiedelt ist? - xml, xquery, xquery-3.0

Woher weiß ich, welche Stadt in dieser XML-Datei die am stärksten bevölkerte Stadt ist? - xml, xquery, xquery-3.0

Ich habe ein XML wie folgt:

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

Ich brauche einen xQuery-Ausdruck, um den Namen der bevölkerungsreichsten Stadt zu erhalten, aber ich weiß nicht, wie ich das machen soll. Einige Ideen?

Antworten:

1 für die Antwort № 1

Nun, wählen Sie die city Elemente, wählen Sie die maximale Bevölkerung und dann die Stadt mit dieser Bevölkerung zum Beispiel:

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

Oder sortiere und nimm den ersten:

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

Du könntest auch die sort Funktion:

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

1 für die Antwort № 2

Der traditionelle Weg in XQuery 1.0 ist

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

Dies hat jedoch den Nachteil, dass die Daten zweimal gescannt werden.

Sie können dies vermeiden, indem Sie Funktionen höherer Ordnung verwenden, z.https://www.w3.org/TR/xpath-functions-31/#highest-lowest) oder eine Faltoperation:

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 bietet eine Erweiterungsfunktion saxon: highest, die dem höchsten Beispiel in der Spezifikation entspricht, damit Sie schreiben können

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

0 für die Antwort № 3

Sie können dies versuchen:

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