我正在尝试计算XML文件中Harbor元素的数量。但是,我不断收到以下错误:
item expected, sequence found: (element harbour {...}, ...)
代码段如下:
for $harbour in distinct-values(/VOC/voyage/leftpage/harbour)
let $count := count(/VOC/voyage/leftpage/harbour eq $harbour)
return concat($harbour, " ", $count)
输入XML:
<voyage>
<number>4411</number>
<leftpage>
<harbour>Rammekens</harbour>
</leftpage>
</voyage>
<voyage>
<number>4412</number>
<leftpage>
<harbour>Texel</harbour>
</leftpage>
</voyage>
有人可以帮帮我吗?如何迭代XML文件中的港口数量而不是尝试使用/VOC/voyage/leftpage/harbour
?
答案 0 :(得分:1)
eq
是值比较,即用于比较单个项目。这就是为什么错误消息告诉你它正在期待(单个)项目,而是找到所有的港口元素。您必须使用常规比较运算符=
。此外,当你比较它时
/VOC/voyage/leftpage/harbour = $harbour
它总是1,因为它将比较存在。相反,您希望过滤掉具有相同文本元素作为子项的所有harbour
项。您可以使用[]
执行此操作。它们将一起
for $harbour in distinct-values(/VOC/voyage/leftpage/harbour)
let $count := count(/VOC/voyage/leftpage/harbour[. = $harbour])
return concat($harbour, " ", $count)
另外,如果你的XQuery处理器支持XQuery 3.0,你也可以使用group by
运算符,我认为这个运算符更好(可能更快,但这取决于实现):
for $voyage in /VOC/voyage
let $harbour := $voyage/leftpage/harbour
let $harbour-name := $harbour/string()
group by $harbour-name
return $harbour-name || " " || count($harbour)