xquery - 如何在 MarkLogic XQuery 中编写 while 循环

标签 xquery marklogic

是否有任何公认的习惯用法可以在 MarkLogic XQuery 中编写相当于 while 循环的内容?我知道我可以编写一个尾递归例程,但 MarkLogic XQuery 不会优化尾递归,并且我遇到了堆栈溢出(我必须绕循环约 20000 次)。

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

最佳答案

递归是通常的方法。另一种方法是将 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 表达式。如果需要,您可以将 token 计数乘以某个因子,或使用任意大的数字。

https://github.com/robwhitby/xray/blob/coverage/src/coverage.xqycover:actual-via-debug 函数中有一个更复杂的示例。

关于xquery - 如何在 MarkLogic XQuery 中编写 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13359631/

相关文章:

xquery - 马克逻辑cts :document-query

Xslt 键函数的 Xquery 函数

marklogic - 通过 gradle 执行时,mlcp 未加载文档

java - 如何使用 JavaApi 将重音字符从 XML 写入 MarkLogic?

java - 以非顺序方式进行 XQuery 迭代

sql - xQuery LIKE 运算符?

xml - 在 XQuery 中创建 map

gradle - 使用ML Gradle创建Marklogic Forest

curl - 查询 MarkLogic 7 SPARQL 端点

javascript - MarkLogic 应用程序服务器自定义登录页面未从 ajax GET 请求接收 SessionID cookie