我正在尝试使用Marklogic 8的部分更新(补丁)功能来更改元素的属性和同一请求中元素的文本内容。
如果我有这样的文件:
<root>
<foo a1="1" a2="2" a3="3" a4="4">text content</foo>
</root>
我尝试使用以下方式更新它:
<rapi:patch xmlns:rapi="http://marklogic.com/rest-api">
<rapi:replace select="/root/foo">replace text</rapi:replace>
<rapi:replace select="/root/foo/@a3">replace a3</rapi:replace>
</rapi:patch>
我得到XDMP-CONFLICTINGUPDATES
。该文档提到“所选节点不能成为补丁中任何其他操作的目标。所选节点的祖先不能通过同一补丁中的删除,替换或替换插入操作进行修改。我猜我在这里碰到了,因为我选择的是元素,而不是直接选择文本节点。
使用xquery,我可以指定一个文本节点进行替换,如下所示:
xdmp:node-replace(fn:doc($uri)/root/foo/text() , text{ "new text" } )
但是,我似乎无法通过补丁来做到这一点。使用/root/foo/text()
会导致无效路径出错,因为补丁需要可用于定义索引的路径表达式。
有没有办法在同一个请求中更改这两个值?
答案 0 :(得分:3)
由于(如您所述)您无法专门提及文本元素,因此我认为您需要替换整个元素:
<rapi:patch xmlns:rapi="http://marklogic.com/rest-api">
<rapi:replace select="/root/foo">
<foo a1="1" a2="2" a3="new 3" a4="4">new text</foo>
</rapi:replace>
</rapi:patch>
元素是属性的父元素,因此无法转义冲突的更新。