2017-11-21 9 views
0

私はこのようなXMLがあります。この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

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 
0

あなたはこの試みることができます、まあ

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

のXQuery 1.0での伝統的な方法は

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

である。しかし、これは2倍のデータをスキャンするという欠点があります。

あなたは、たとえば、高階関数を使用して、例えばこれを避けることができます。最高()関数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を提供します。最高:これは、例:specの最高の例と等価です。したがって、書き込むことができます。

saxon:highest(//city, function($city){number($city/population)})/name 
関連する問題