[英]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.