2016-06-11 76 views
0
declare variable $testseq as item()* :=(); 

declare function local:insertseq($target as item()*, $position as xs:integer?, $inserts as item()*) 
as item()* (:might be great if we have a keyword to represent nothing:) 
{ 
    fn:insert-before($target, 1, $inserts) (:change the global sequence:) 
() (:simulate returning nothing, empty sequence:) 
}; 

element test 
{ 
    attribute haha {"&"}, 
    local:insertseq($testseq, 1, ('a', 'b')), 
    $testseq 
} 

我需要在腳本運行時將某些東西收集到全局序列中。在腳本結尾我釋放序列。函數insertseq必須不返回任何內容。 XQuery有可能嗎?或者還有其他的技巧可以做到嗎?從BaseXXQuery:聲明函數不返回

錯誤:

$ basex test.xqy 
Stopped at /Users/jack/Documents/SHK/XSD2OWL/Workspace/xqy/test.xqy, 7/4: 
[XPTY0004] Item expected, sequence found: ("a", "b"). 
+0

XQuery是一種功能性語言。即使你使用'insert-before'也是不正確的:它不會修改任何內容,它會返回一個新的序列。你需要重新思考你在輸入/輸出方面做了什麼;如果在處理結束時需要一個序列,那麼該序列將需要成爲返回值的一部分。 –

+0

某些實現有一個「腳本」擴展,其中有可變變量 – BeniBela

回答

2

您的原始問題的標題的答案實際上是:

declare function local:f() as empty-sequence() { 
() 
}; 

正如你可能想解決一個具體的問題,你能想到的關於創建一個帶有另一個標題和相應問題描述的新問題(包括預期輸入和輸出的一個小例子)。

在函數式語言(如XQuery)中,變量一旦定義就不能重新分配(請參見Referential Transparency)。因此,您需要使用遞歸函數爲序列重複添加值。 fn:fold-left也可以使用:第一次使用時感覺有挑戰性,但一旦你明白它的作用,你不想錯過。