gpt4 book ai didi

marklogic - 使用 xquery 和 xdmp 更新 xml 中的多个节点 :node-replace

转载 作者:行者123 更新时间:2023-12-01 11:57:47 25 4
gpt4 key购买 nike

我想更新我的 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 is not of 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)] 有更好的解决方案?

关于marklogic - 使用 xquery 和 xdmp 更新 xml 中的多个节点 :node-replace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4510465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com