2017-05-30 31 views
1

我已經提供了用於插入和節點替換查詢的示例Xquery。Marklogic - 如何在單個xquery中執行插入和節點替換

我的問題是如果我要執行查詢,它只會首先插入XML。

即使我要執行第二次節點將被替換。

但是我想單個執行它將被處理插入和更新。

sample query : 

xquery version "1.0-ml"; 
declare namespace html = "http://www.w3.org/1999/xhtml"; 
let $a := xdmp:document-insert("/fo.xml", <a>1</a>) 

let $b := xdmp:node-replace(fn:doc("/fo.xml")/a, <b>1</b>) 

return ($a,$b) 

回答

1

你不能在一個語句中這樣做。你要麼需要:

  1. 使用多語句調用(用分號分隔主語句)
  2. 做內存的更新,更新後的內容傳遞給插入

關於1:

應用程序開發人員指南有部分約Semi-Colon as a Statement Separator,但總之它歸結爲寫你的查詢,如下所示:

xquery version "1.0-ml"; 
xdmp:document-insert("/fo.xml", <a>1</a>) 
; 
xquery version "1.0-ml"; 
xdmp:node-replace(fn:doc("/fo.xml")/a, <b>1</b>) 

關於2:

有一些規定,操作起來非常類似於xdmp方法庫:節點 - *的,但對尚未保存到數據庫,而不是內容進行操作。您需要首先下載它們,然後將它們上傳到模塊數據庫以便使用它們。我知道的最好的版本是https://github.com/ryanjdew/XQuery-XML-Memory-Operations。您可以使用MLPM進行下載和安裝。有了這個庫,你可以寫如下:

import module namespace mem = "http://maxdewpoint.blogspot.com/memory-operations" at "/ext/mlpm_modules/XQuery-XML-Memory-Operations/memory-operations.xqy"; 

let $a := <a>1</a> 
let $b := <b>1</b> 
let $updated-a := mem:copy($a) ! (
    mem:replace(., $a, $b), 
    mem:execute(.) 
) 
return xdmp:document-insert("/foo.xml", $updated-a) 

HTH!在線路末端

xdmp:document-insert("/fo.xml", <a>1</a>); 
xdmp:node-replace(fn:doc("/fo.xml")/a, <b>1</b>); 

通知分號:

+0

感謝您的更新......如何?我只提供了示例查詢,過去兩天我一直堅持使用此查詢,請你提供樣本或修改上述內容。 – Antony

+1

我正在更新答案.. – grtjn

+0

是的,但我正在使用循環,所以我不能存儲內存,如果我是商店內存重複的內容將被插入相同的XML。 – Antony