在 MarkLogic XQuery 中编写等效的 while 循环是否有任何公认的习惯用法?我知道我可以编写一个尾递归例程,但 MarkLogic XQuery 并没有优化尾递归,而且我遇到了堆栈溢出(我必须绕着我的循环循环 ~20000 次)。
编者注:从 MarkLogic 6 开始,尾递归在 MarkLogic 中进行了优化。
递归是通常的方式。另一种是使用带有 a 的 FLWOR 并使用try-catch
已知代码引发异常以提前退出。
try {
for $x in 1 to count($tokens)
return tok($x) }
catch ($ex) {
if ($x/error:code eq 'BREAK') then ()
else xdmp:rethrow() }
该tok
函数将调用error((), 'BREAK')
以退出父 FLWOR 表达式。如果需要,您可以将令牌计数乘以某个因子,或使用任意大的数字。
https://github.com/robwhitby/xray/blob/coverage/src/coverage.xqy有一个更复杂的例子,在cover:actual-via-debug
函数中。
XQuery 中的常用方法是使用 FLWOR 表达式。如何编写这个在很大程度上取决于您的循环和数据,因为它不是从其他语言已知的 while 循环的精确映射。
所以你可以做的是例如
let $c := doc('my.doc')/root/get-all-my-elements-using-xpath
return process-result($c)
如果您需要进一步的建议,请更具体地说明您实际想要做什么。