我有2个xquery代码,其中1给出正确的结果,但2不是。为什么?

问题描述 投票:1回答:1

我应该显示超过一半的人口说德语的国名。

1 The code below gives the correct result

doc("countries.xml")//country/language[contains(.,"German") and data(@percentage)>50]/../data(@name)

2 This code below doesn't give the correct answer.

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>
xml xpath xquery
1个回答
2
投票

您在这两个查询中的约束条件不同。在第一个查询中,您将两个约束应用于相同的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
© www.soinside.com 2019 - 2024. All rights reserved.