2014-09-04 33 views
0

Marklogic 7,Windows 7的Marklogic - xdmp:EVAL產生錯誤,如「無效選項節點」

我想寫XQuery來改變文件使用xdmp:load中的URI(ML的本地版本)和xdmp:delete在單個交易中起作用。

我終於決定使用xdmp:eval。什麼導致錯誤?

碼如下: -

for $SrcFileNode in xdmp:directory("/Abstracts/", "infinity") [position() lt 10] 
(: get filename from path string :) 
let $Filename := (if (fn:contains(fn:document-uri($SrcFileNode),".zip/")) 
        then fn:substring-after(document-uri($SrcFileNode),".zip/") 
        else fn:substring-after(document-uri($SrcFileNode),"Loadrecords/") 
       ) 

(: create new URI would "document{...}" be better? :) 
let $newURInode := xdmp:unquote(
           fn:concat('<options xmlns="xdmp:document-load"><uri>/Abstracts/' 
              ,$Filename,'</uri><repair>none</repair><permissions>' 
              ,xdmp:default-permissions(),'</permissions><collections><collection>' 
              ,'Abstracts','</collection></collections></options>') 
           ) 

(: get string of node's name :) 
let $SrcFileStr := xdmp:quote(fn:document-uri($SrcFileNode)) 

(: build a string of the copy + delete actions in a single transaction as applied to the current file. Implement the action using "xdmp:eval" :) 
let $LoadDelCMD := 'xquery version "1.0-ml"; 
        declare option xdmp:transaction-mode "update"; 
        xdmp:document-load($SrcFileStr,$newURInode); 
        xdmp:document-delete($SrcFileStr); 
        xdmp:commit()' 

(: execute the copy/delete for the current document :) 

(: 1st attempt... 
return xdmp:eval($LoadDelCMD,(),<options xmlns="xdmp:eval"> <isolation>different-transaction</isolation> <prevent-deadlocks>true</prevent-deadlocks></options>) 
:) 

(: 2nd attempt... 
let $Option := document{<options xmlns="xdmp:eval"><isolation>different-transaction</isolation> <prevent-deadlocks>true</prevent-deadlocks></options>} 
return xdmp:eval($LoadDelCMD,(),$Option) 
:) 

(: 3rd attempt... 
let $Option2 := xdmp:unquote('<options xmlns="xdmp:eval"> <isolation>different-transaction</isolation> <prevent-deadlocks>true</prevent-deadlocks></options>') 
return xdmp:eval($LoadDelCMD,(),$Option2) 
:) 
+0

的錯誤是...... 「[1.0毫升] XDMP-INVOPTNOD:xdmp:EVAL(」 版本的XQuery 1.0 "毫升"; ...「,(),文件{<選項xmlns =「xdmp:eval」>不同交易<預防死鎖> t ...}) - 無效選項節點:fn:doc(「」)「OR」[1.0-ml] XDMP-BADCHAR: (err:XPST0003)發現意外字符'''(0x0022) 在第3行第58列「 在第48行第8列 – 2014-09-04 09:33:26

回答

3

關於錯誤本身,它抱怨$Option含有包裹在一個文檔節點的選項元素。通過刪除文檔節點構造函數來擺脫文檔節點。它從文件中提取選項,您可以通過在其後添加/*來打開它。

除此之外,我認爲你正在做的事情比必要的更復雜。如果你只是想更新文檔,那麼不需要刪除,只需再次插入或加載到相同的URI。如果您想將文檔移動到不同的位置,只需在與刪除相同的事務中進行插入/加載。只要沒有插入/加載/刪除應用於同一個uri,就不會發生衝突的更新,並且在代碼的成功結束時,所有更新都會同時保留。

您不是第一個想要在數據庫中移動/重命名文檔的人。這裏鏈接到一個不錯的輔助函數到一個數據庫中移動文檔:

http://markmail.org/message/2e5wu3sqgpiwnu5m

哦,對了,你的EVAL加載和刪除同一個URI。這聽起來不像改變文件的uris ..

HTH!

+0

」grtn「感謝您提供鏈接代碼的唯一目的是將文檔從uri 1移動到uri 2.使用eval的原因是作爲運行插入和刪除任務的一種方式交易中的策略行動(從早期的StackOverflow中提取的想法)。所有3個「返回」選項似乎都會產生錯誤,即使使用xdmp:eval($ LoadCmd,(), ...)語法也是如此。我將仔細研究包含在您提到的節點問題中的元素。我會再去沒有評價,看看我能否得到那個「打球」。 – 2014-09-04 13:21:42

+0

使用上面提到的重命名函數可能是將文檔移動到不同uris的最快和最安全的方法。正如所解釋的,你不需要刪除和插入不同的語句,所以不需要顯式的事務性麻煩。一個單獨的聲明已經完全ACID事務.. – grtjn 2014-09-04 13:38:04

+0

該鏈接將做我需要它做的事情。非常感謝。 – 2014-09-04 14:31:07

相關問題