Marklogic 使用xquery和xdmp更新xml中的多个节点:节点替换

Marklogic 使用xquery和xdmp更新xml中的多个节点:节点替换,marklogic,xquery,Marklogic,Xquery,我想更新XML数据库(Marklogic)中的XML文档。我将xml作为输入,并希望替换目标xml中存在的每个节点 如果一个节点不存在,那么添加它会很好,但这可能是另一个任务 数据库中的我的XML: <user> <username>username</username> <firstname>firstname</firstname> <lastname>lastname</lastname>

我想更新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\u xml/user
。如果我尝试在
$user\u xml
上迭代,我会得到异常

arg1不是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)]

如果您不打算使用标准XQuery更新,也不打算使用标准XQuery来获得更新的结果,但要使用一些MarkLogic的扩展函数,那么这是一个
xqueryengines
问题
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)
};
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)
};