我应该显示超过一半的人口说德语的国名。
码
doc("countries.xml")//country/language[contains(.,"German") and data(@percentage)>50]/../data(@name)
码
let $d:=doc("countries.xml")
for $p in $d/countries/country[language="German"] where data($p/language/@percentage)>50
return data($p/@name)
问题:我无法理解为什么第一个有效,第二个无效。如果有人能够解释我的逻辑中的缺陷,我将不胜感激。谢谢
这是xml数据的一部分:
<country name="Belgium" population="10170241" area="30510">
<language percentage="32">French</language>
<language percentage="1">German</language>
<language percentage="56">Dutch</language>
</country>
您在这两个查询中的约束条件不同。在第一个查询中,您将两个约束应用于相同的language
:
language[contains(.,"German") and data(@percentage)>50]
在第二个查询中,$p
是/country[language="German"]
,然后它也被约束到data($p/language/@percentage)>50
。但是这两个约束条件下的language
不能保证是相同的,只能在同一个国家内,所以查询匹配同一国家内的任何language/@percentage > 50
和任何language="German"
。
您想要将两个约束应用于同一种语言:
for $p in $doc/countries/country
where $p/language[@percentage >50 and contains(.,"German")]
return $p/@name