Xquery 计算文件中元素的数量

Xquery 计算文件中元素的数量,xquery,Xquery,我试图计算XML文件中的元素数。但是,我不断遇到以下错误: 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, "

我试图计算XML文件中的元素数。但是,我不断遇到以下错误:

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>

4411
拉梅肯斯
4412
特克塞尔

有人能帮我吗?如何迭代XML文件中的港口数量,而不是尝试使用
/VOC/seave/leftpage/harbour

eq
是一种值比较,即用于比较单个项目。这就是为什么错误消息告诉您它需要一个(单个)项,但却找到了所有元素。您必须使用常规比较运算符
=
。还有,你什么时候会这样比较呢

/VOC/voyage/leftpage/harbour = $harbour
它总是1,因为它将比较存在。相反,您希望筛选出所有具有与子项相同的文本元素的
项目。您可以使用
[]
执行此操作。总的来说是这样的

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
操作符,我认为这更易于阅读(也可能更快,但这取决于实现):


Thnx为了您的快速响应,我试图计算XML文件中存在海港的次数。因此,对于每个海港,我想知道它在这个XML文件中出现了多少次。那么,在您的输入中,什么构成了不同的海港呢?他们有不同的名字或ID吗?如果您包含一个输入XML的小片段,这将非常有用。示例片段如下所示:4411 Rammekens 4412 Texel我正在尝试遍历所有港口,以查看港口存在的次数。@Paul,德克的两个建议应该给出不同的计数。在像XQuery这样的声明性语言中,您不必“迭代”,只需编写选择或计算结果的表达式即可。建议的飞贼就是这么做的。
for $voyage in /VOC/voyage
let $harbour := $voyage/leftpage/harbour
let $harbour-name := $harbour/string()
group by $harbour-name
return $harbour-name || " " || count($harbour)