计算文件中的nr个元素

时间:2018-01-21 20:22:40

标签: xquery

我正在尝试计算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

1 个答案:

答案 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)