【发布时间】:2017-06-02 12:04:17
【问题描述】:
如何在 XML 中插入节点。
let $a := <a><b>bbb</b></a>)
return
xdmp:node-insert-after(doc("/example.xml")/a/b, <c>ccc</c>);
预期输出:
<a><c>ccc</c><b>bbb</b></a>
请帮助获取输出。
【问题讨论】:
标签: xquery marklogic xpath-2.0
如何在 XML 中插入节点。
let $a := <a><b>bbb</b></a>)
return
xdmp:node-insert-after(doc("/example.xml")/a/b, <c>ccc</c>);
预期输出:
<a><c>ccc</c><b>bbb</b></a>
请帮助获取输出。
【问题讨论】:
标签: xquery marklogic xpath-2.0
你应该使用xdmp:node-insert-before我相信以下方式:
xdmp:document-insert('/example.xml', <a><b>bbb</b></a>);
xdmp:node-insert-before(fn:doc('/example.xml')/a/b, <c>ccc</c>);
fn:doc('/example.xml');
(: returns <a><c>ccc</c><b>bbb</b></a> :)
【讨论】:
节点是不可变的,所以内存中的变异只能通过创建一个新副本来完成。
副本可以使用原始未修改的包含节点:
declare function local:insert-after(
$prior as node(),
$inserted as node()+
) as element()
{
let $container := $prior/parent::element()
return element {fn:node-name($container)} {
$container/namespace::*,
$container/attribute(),
$prior/preceding-sibling::node(),
$prior,
$inserted,
$prior/following-sibling::node()
}
};
let $a := <a><b>bbb</b></a>
return local:insert-after($a//b, <c>ccc</c>)
在内存中创建副本然后插入副本比在数据库中插入和修改文档要快。
根据插入的文档数量,差异可能很大。
有用于复制更改的社区库,但有时编写快速函数也很容易(必要时递归)。
【讨论】:
您可以使用以下代码将元素插入 XML:
xdmp:node-insert-child(fn:doc('directory URI'),element {fn:QName('http://yournamesapce','elementName') }{$elementValue})
这里我们使用fn:QName 删除添加节点中添加的xmlns=""。
【讨论】: