在MarkLogic XQuery中编写等效的while循环是否有任何公认的习惯用法?我知道我可以编写一个尾递归例程,但MarkLogic XQuery不会优化尾递归,而且我会得到堆栈溢出(我必须绕过我的循环~20000次)。
编辑说明:从MarkLogic 6开始,尾递归在MarkLogic中进行了优化。
答案 0 :(得分:3)
递归是通常的方式。另一种方法是使用带有try-catch
的FLWOR并使用已知代码抛出异常以提前退出。
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
函数中有一个更复杂的例子。
答案 1 :(得分:0)
XQuery中的常用方法是使用FLWOR表达式。如何写这个高度取决于你的循环和数据,因为它不是一个与其他语言已知的while循环的精确对比。
所以你可以做的就是例如。
let $c := doc('my.doc')/root/get-all-my-elements-using-xpath
return process-result($c)
如果您需要进一步的建议,请更具体地说明您想要做什么。