如何在MarkLogic XQuery中编写while循环

时间:2012-11-13 11:04:08

标签: xquery marklogic

在MarkLogic XQuery中编写等效的while循环是否有任何公认的习惯用法?我知道我可以编写一个尾递归例程,但MarkLogic XQuery不会优化尾递归,而且我会得到堆栈溢出(我必须绕过我的循环~20000次)。

编辑说明:从MarkLogic 6开始,尾递归在MarkLogic中进行了优化。

2 个答案:

答案 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.xqycover:actual-via-debug函数中有一个更复杂的例子。

答案 1 :(得分:0)

XQuery中的常用方法是使用FLWOR表达式。如何写这个高度取决于你的循环和数据,因为它不是一个与其他语言已知的while循环的精确对比。

所以你可以做的就是例如。

let $c := doc('my.doc')/root/get-all-my-elements-using-xpath
return process-result($c)

如果您需要进一步的建议,请更具体地说明您想要做什么。