了解 XQuery 中的 for 循环以计算 BaseX 中的出现次数

Understanding for-loop in XQuery to count occurrences in BaseX

我正在尝试计算 BaseX 中 XML 结构的出现次数。

declare variable $a := 0;
for $node in db:open("My_DB")/my/xml//path
$a += 1

return $a

当运行这时,BaseX returns错误:不完整的FLWOR表达式:期待'return'。

我知道我可以用这个简单的函数数数:

count(db:open("My_DB")/my/xml//path)

但是我尝试使用 for 循环执行此操作有两个原因:

  1. 我的主管告诉我 for 循环更快
  2. 将来我可能希望每次命中执行更多操作(在 for 循环中)

所以问题是:如何使用 BaseX 使用 XQuery 对 for 循环中的元素进行计数。

由于 XQuery 是一种函数式语言,因此无法将其他值重新分配给函数。但是,您可以使用 fold-left 在循环中递增值:

fold-left(db:open("My_DB")/my/xml//path, 0, function($result, $curr) {
  $result + 1
})

count() 的执行时间取决于 XQuery 的实现。在 BaseX 中,count() 通常比循环快得多,因为在许多情况下它可以通过在数据库统计信息中查找来加速。