由於XQuery的語義,所有子節點需要,如果他們被新的父節點包裹被複制。這通過以下查詢來演示,該查詢比較原始節點和複製節點的節點標識。這將產生false
:
let $node := <node/>
let $parent := <parent>{ $node }</parent>
return $parent/node is $node
由於複製幾百萬個節點是昂貴的,這不可避免地會導致內存外的一個錯誤。
如果結果寫入文件,這裏是一個務實的解決方案來解決這個限制:
(:~
: Writes element to a file, wrapped by a root node.
: @param $path path to file
: @param $elements elements to write
: @param $name name of root node
:)
declare function local:write-to(
$path as xs:string,
$elements as element()*,
$name as xs:string
) as empty-sequence() {
file:write-text($path, '<' || $name || '>'),
file:append($path, $elements),
file:append-text($path, '</' || $name || '>')
};
local:write-to('result.xml', <result/>, 'root')
爲了預測批評:這是一個明確的黑客。例如,該方法與BaseX的各種非默認序列化參數相沖突(如果需要輸出XML聲明,則結果不會很好)。
從來沒有想過,在這種情況下複製節點...這就解釋了它。我會嘗試你的建議並回複評論。非常感謝你! – unicorn