为什么XQuery表达式返回错误的元素数?

时间:2016-03-06 18:32:59

标签: xml count xml-parsing xquery xquery-3.0

我希望每个时间表返回L1和L0项目的数量,还要按照时间表返回警告数量。

实际上是"计算"情况。

我尝试了以下XQuery,它可以很好地计算L1,L0和警告,但会计算所有警告,而不是仅计算<ifram>的警告。

<div>
                                 <iframe src="http://localhost:63342/odoo/geolocation/google_map.html?longitude=34.681178&amp;latitude=-1.925503&amp;key=AIzaSyAZkVmtvhuKp9U34DlKIicoW3CVEAuM0zM" width="825px" height="500px" frameborder="0"></iframe>
                            </div>

示例XML:

value = "yes"

2 个答案:

答案 0 :(得分:5)

实际上,你也在计算错误的L0警告 - 但是偶然的,他们的结果是正确的。

尝试返回$schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE/string() = "Yes"(没有聚合)以了解出现了什么问题。此子查询返回一个布尔值,如果左侧的任何值与右侧的任何值匹配(在这种情况下,只是一个值),则该值为true。换句话说,如果任何警告是Yes,则语句将获得true。如果完全不匹配,则返回false。在XQuery中,=具有集合语义。

现在,你计算结果的数量,无论布尔结果是什么,都是1

总结一下,代码中有两个问题:

  • 如果您想比较单个元素,请不要使用=,而是使用eq(还有lqgqle gene<><=),>=!=
  • 不要比较结果序列(它将返回一个布尔值),但是使用谓词对其进行过滤。

L0警告的正确子查询将是

count($schedule/L0/ATTRIBUTE[@NME = "Warnings"]/VALUE[string() eq "Yes"])

同样对于L1警告:

count($schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE[string() eq "Yes"])

答案 1 :(得分:0)

在这里非常完整:现在这是可行的XQuery:

xquery version "3.0";

let $nl := "&#10;"
let $pipe := "&#124;"

for $profiles in doc("maik test.xml")/PROFILE
for $schedule in $profiles/SCHEDULE
let $schedulename := $schedule/@name
group by $schedulename
return ($nl, 
$schedulename, $pipe, "L0 count:", count($schedule/L0),
$pipe, "L0 Warnings:", count($schedule/L0/ATTRIBUTE[@NAME = "Warnings"]/VALUE[string() eq "Yes"]),
$pipe, "L1 count:", count($schedule/L0/L1),
$pipe, "L1 Warnings:", count($schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE[string() eq "Yes"]))