簡體   English   中英

如何在 MarkLogic XQuery 中編寫 while 循環

[英]How to write a while loop in MarkLogic XQuery

是否有任何公認的習慣用法可以在 MarkLogic XQuery 中編寫相當於 while 循環的語句? 我知道我可以編寫一個尾遞歸例程,但 MarkLogic XQuery 沒有優化尾遞歸,而且我遇到了堆棧溢出(我必須循環大約 20000 次)。

編者按:從 MarkLogic 6 開始,尾遞歸在 MarkLogic 中得到了優化。

遞歸是常用的方法。 另一種方法是使用帶有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函數中。

XQuery 中的常用方法是使用 FLWOR 表達式。 如何編寫這在很大程度上取決於您的循環和數據,因為它不是到其他語言已知的 while 循環的精確映射。

所以你可以做的是例如

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

如果您需要進一步的建議,請更具體地說明您真正想要做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM