MarkLogic XQueryでwhileループに相当するものを書くための認識されたイディオムはありますか?末尾再帰ルーチンを記述できることは知っていますが、MarkLogic XQueryは末尾再帰を最適化せず、スタックオーバーフローが発生します(ループを約20000回回避する必要があります)。
編集者注記:MarkLogic 6の時点で、末尾再帰はMarkLogicで最適化されています。
再帰は通常の方法です。もう1つは、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
ます。
XQueryの通常の方法は、FLWOR式を使用することです。これをどのように書くかは、他の言語で知られているwhileループへの正確なマッピングではないため、ループとデータに大きく依存します。
だからあなたができることは例えば
let $c := doc('my.doc')/root/get-all-my-elements-using-xpath
return process-result($c)
さらにアドバイスが必要な場合は、実際に何をしたいのかを具体的に説明してください。