我希望每个时间表返回L1和L0项目的数量以及每个时间表的警告数量.
我尝试了以下XQuery,它可以很好地计算L1,L0和警告,但会计算所有警告,而不是仅计算值为“是”的警告.
xquery version "3.0"; let $nl := " " let $quote := """ let $pipe := "|" let $nodecount := 0 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),"L0 Warnings:",count($schedule/L0/ATTRIBUTE[@NAME = "Warnings"]/VALUE/string() = "Yes"),"L1 count:",count($schedule/L0/L1),"L1 Warnings:",count($schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE/string() = "Yes"))
示例XML:
<?xml version="1.0" encoding="UTF-8"?> <PROFILE name="profile1"> <SCHEDULE name="schedule1"> <L0> <ATTRIBUTE NAME="Warnings"> <VALUE>No</VALUE> </ATTRIBUTE> <L1> <ATTRIBUTE NAME="Warnings"> <VALUE>No</VALUE> </ATTRIBUTE> </L1> <L1> <ATTRIBUTE NAME="Warnings"> <VALUE>No</VALUE> </ATTRIBUTE> </L1> <L1> <ATTRIBUTE NAME="Warnings"> <VALUE>Yes</VALUE> </ATTRIBUTE> </L1> <L1></L1> </L0> <L0> <ATTRIBUTE NAME="Warnings"> <VALUE>No</VALUE> </ATTRIBUTE> <L1></L1> </L0> </SCHEDULE> <SCHEDULE name="schedule2"> <L0> <L1></L1> <L1></L1> <L1></L1> <L1></L1> </L0> <L0> <L1></L1> </L0> <L0> <L1></L1> <L1></L1> <L1></L1> </L0> </SCHEDULE> </PROFILE>
解决方法
实际上,你也在计算错误的L0警告 – 但是偶然的,它们的结果是正确的.
尝试返回$schedule / L0 / L1 / ATTRIBUTE [@NAME =“Warnings”] / VALUE / string()=“是”(没有聚合)以了解出现了什么问题.此子查询返回一个布尔值,如果左侧的任何值与右侧的任何值匹配(在这种情况下,只是一个值),则该值为true.换句话说,如果任何警告为“是”,则该语句为true.如果根本不匹配,则返回false.在XQuery中,=有一个set-semantics.
现在,你计算结果的数量,无论布尔结果是什么,它都是1.
总结一下,代码中有两个问题:
>如果要比较单个元素,请不要使用=,而是使用eq(还有lq,gq,le,ge和ne用于<,>,< =,> =,!=).
>不要比较结果序列(将返回布尔值),而是使用谓词对其进行过滤.
L0警告的正确子查询将是
count($schedule/L0/ATTRIBUTE[@NME = "Warnings"]/VALUE[string() eq "Yes"])
类似的L1警告:
count($schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE[string() eq "Yes"])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。