2017-04-19 7 views
2

Markryic 8の部分更新(パッチ)機能を使用して、同じ要求内の要素の属性と要素のテキストコンテンツの両方を変更しようとしています。MarkLogicのパッチ機能を使用してテキストコンテンツと属性の両方を置換する

私はこのような文書がある場合:

<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を取得します。ドキュメントには、「選択されたノードはパッチ内の他の操作のターゲットになることはできません。選択したノードの祖先は、同じパッチ内のdelete、replace、またはreplace-insert操作では変更できません。私は要素を選択し、テキストノードを直接選択しているわけではないので、私はここにそれを実行していると思います。

XQueryを使用して、私はこのような交換のためのテキストノードを指定することができます。

xdmp:node-replace(fn:doc($uri)/root/foo/text() , text{ "new text" }) 

は、しかし、私はこれはパッチで行うことができるようには見えません。 /root/foo/text()を使用すると、無効なパスに関するエラーが発生します。パッチには、索引の定義に使用できるパス式が必要なためです。

同じリクエストでこれらの値を両方とも変更する方法はありますか?

答えて

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> 

要素は、属性の親であるので、競合するアップデートから逃れる方法はありません。

+1

私はそれを恐れていました。価値があるショット...ありがとう! – paloma

関連する問題