2014-09-04 34 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

相关问题