/ / मैं कैसे जान सकता हूं कि इस XML में सबसे अधिक आबादी वाला शहर कौन सा है? - xml, xquery, xquery-3.0

मैं कैसे जान सकता हूं कि इस एक्सएमएल में सबसे अधिक आबादी वाला शहर कौन सा है? - एक्सएमएल, 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

उत्तर № 2 के लिए 1

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:highest(//city, function($city){number($city/population)})/name

जवाब के लिए 0 № 3

आप इसे आजमा सकते हैं:

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