了解 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 循环执行此操作有两个原因:
- 我的主管告诉我 for 循环更快
- 将来我可能希望每次命中执行更多操作(在 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()
通常比循环快得多,因为在许多情况下它可以通过在数据库统计信息中查找来加速。
我正在尝试计算 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 循环执行此操作有两个原因:
- 我的主管告诉我 for 循环更快
- 将来我可能希望每次命中执行更多操作(在 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()
通常比循环快得多,因为在许多情况下它可以通过在数据库统计信息中查找来加速。