【问题标题】:updating multiple nodes in xml with xquery and xdmp:node-replace使用 xquery 和 xdmp:node-replace 更新 xml 中的多个节点
【发布时间】:2011-05-29 11:16:19
【问题描述】:

我想更新我的 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 不是 node() 类型

但也许这是错误的方法?

有人可能有示例代码如何做到这一点?

【问题讨论】:

  • 如果您不打算使用标准的 XQuery 更新,也不会使用标准的 XQuery 来获得更新的结果,但您将使用 MarkLogic 的一些扩展功能,那么这是xqueryengines问题

标签: marklogic xquery


【解决方案1】:

我必须自己回答:

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)] 有更好的解决方案?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多