使用Xquery 1.0,这是我正在使用的数据的一小部分样本:
<countries>
<country name="Afghanistan" population="22664136" area="647500">
<language percentage="11">Turkic</language>
<language percentage="35">Pashtu</language>
<language percentage="50">Afghan Persian</language>
</country>
<country name="Albania" population="3249136" area="28750"/>
<country name="Algeria" population="29183032" area="2381740">
<city>
<name>Algiers</name>
<population>1507241</population>
</city>
</country>
<country name="American Samoa" population="59566" area="199"/>
<country name="Andorra" population="72766" area="450"/>
<country name="Angola" population="10342899" area="1246700"/>
<country name="Anguilla" population="10424" area="91">
<language percentage="100">English</language>
我正在尝试为每个“语言”子元素找到最大的“百分比”属性。经过多次尝试,我注意到了一个问题。
使用以下查询:
for $distinct_language in distinct-values(doc("countries.xml")/countries/country/language)
let $max := max(doc("countries.xml")/countries/country[language = $distinct_language]/language/@percentage)
return <Language_Max language="{$distinct_language}"> {$max} </Language_Max>
一小部分结果是:
<Language_Max language="Turkic">50</Language_Max>
<Language_Max language="Pashtu">50</Language_Max>
<Language_Max language="Afghan Persian">50</Language_Max>
<Language_Max language="English">100</Language_Max>
我期望仅以“突厥语”为例:
<Language_Max language="Turkic">11</Language_Max>
我认为问题是当我根据谓词设置$ max变量时,它会寻找一个将“突厥语”包含为语言的 Country (在这种情况下,该国家/地区是阿富汗) ,然后从该国家/地区的任何一种语言中获取最大百分比(从“阿富汗波斯”语言中获取50%)。
如何返回每种语言的最大百分比属性,而不是该国所有语言的最大百分比?
我希望这是有道理的,感谢您的协助!
答案 0 :(得分:1)
您需要将谓词向下移动一级,并过滤语言而不是国家/地区。这是一种方法(我将语言绑定到一个附加变量,因为相同的数据将被访问两次):
let $languages := doc('countries.xml')/countries/country/language
for $language in distinct-values($languages)
let $max := max($languages[. = $language]/@percentage)
return <Language_Max language="{ $language }">{ $max }</Language_Max>