使用XQUERY和XDMP更新XML中的多个节点:node-replace
题
我想在XML数据库(MarkLogic)中更新XML文档。我有XML作为输入,并希望替换目标XML中存在的每个节点。
如果一个节点不存在,如果添加它,那将是很棒的,但是那也许是另一个任务。
我在数据库中的XML:
<user>
<username>username</username>
<firstname>firstname</firstname>
<lastname>lastname</lastname>
<email>email@mail.de</email>
<comment>comment</comment>
</user>
$ user_xml的值:
<user>
<firstname>new firstname</firstname>
<lastname>new lastname</lastname>
</user>
到目前为止,我的功能:
declare function update-user (
$username as xs:string,
$user_xml as node()) as empty-sequence()
{
let $uri := user-uri($username)
return
for $node in $user_xml/user
return
xdmp:node-replace(fn:doc($uri)/user/fn:node-name($node), $node)
};
首先,我无法迭代 $user_xml/user
. 。如果我试图迭代 $user_xml
我有例外
arg1不为type node()
但是也许是错误的方法?
有人可能有示例代码如何执行此操作吗?
解决方案
我必须自己回答:
declare function update-user (
$username as xs:string,
$user_xml as node()) as empty-sequence()
{
let $uri := user-uri($username)
return
for $node in $user_xml/*
let $target := fn:doc($uri)/user/*[fn:name() = fn:name($node)]
return
if($target) then
xdmp:node-replace($target, $node)
else
xdmp:node-insert-child(fn:doc($uri)/user, $node)
};
但是也许有人有更好的解决方案 /user/*[fn:name() = fn:name($node)]
?
不隶属于 StackOverflow