Mám XML podobný:
<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>
Potrebujem výraz xQuery, aby som dostal meno najľudnatejšieho mesta, ale ja neviem ako to urobiť. Niektoré nápady?
odpovede:
1 pre odpoveď č. 1No, zvoľte city
prvky, vyberte maximálnu populáciu a potom mesto s touto populáciou napríklad:
let $cities := //city,
$max-pob := max($cities/population)
return $cities[population = $max-pob]/name
Alebo zoradiť a urobiť prvé:
(for $city in //city
order by $city/population descending
return $city)[1]/name
Môžete tiež použiť sort
funkcie:
sort(//city, (), function($c) { xs:decimal($c/population) })[last()]/name
1 pre odpoveď č. 2
Tradičný spôsob v XQuery 1.0 je
let $p := max(//population)
return //city[population = $p]/name
To má však nevýhodu v dvojnásobnom skenovaní údajov.
Môžete sa tomu vyhnúť použitím funkcií vyššieho rádu, napríklad napríklad: najvyššia () funkcia zobrazená ako príklad v špecifikácii v D4.6.1 (https://www.w3.org/TR/xpath-functions-31/#highest-lowest) alebo preložením:
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 poskytuje rozšírenie funkcie saxon: najvyššia, ktorá je ekvivalentná napríklad: najvyšší príklad spec, takže môžete písať
saxon:highest(//city, function($city){number($city/population)})/name
0 pre odpoveď č. 3
Môžete to vyskúšať:
//city[population = max(/countries/country/city/population)]/name