3

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

编者注:从 MarkLogic 6 开始,尾递归在 MarkLogic 中进行了优化。

4

2 回答 2

3

递归是通常的方式。另一种是使用带有 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函数中。

于 2012-11-13T16:41:03.210 回答
0

XQuery 中的常用方法是使用 FLWOR 表达式。如何编写这个在很大程度上取决于您的循环和数据,因为它不是从其他语言已知的 while 循环的精确映射。

所以你可以做的是例如

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

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

于 2012-11-13T11:50:27.507 回答