使用MarkLogic的修补程序功能替换文本内容和属性

时间:2017-04-19 15:39:30

标签: marklogic

我正在尝试使用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()会导致无效路径出错,因为补丁需要可用于定义索引的路径表达式。

有没有办法在同一个请求中更改这两个值?

1 个答案:

答案 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>

元素是属性的父元素,因此无法转义冲突的更新。