Marklogic - xdmp:eval会生成诸如“无效选项节点”之类的错误

时间:2014-09-04 09:32:13

标签: marklogic

Marklogic 7,Windows 7.

我试图在单个事务中使用xdmp:loadxdmp:delete函数编写Xquery来更改文档的URI(ML的本地版本)。

我终于决定使用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) 
:)

1 个答案:

答案 0 :(得分:3)

关于错误本身,它抱怨$Option包含文档节点中包含的选项元素。通过删除文档节点构造函数来删除文档节点。它从文件中提取选项,您可以通过在其后面添加/*来解包它。

除此之外,我认为你做的事情比必要的更复杂。如果您只想更新文档,则无需删除,只需再次插入或加载到同一个uri。如果要将文档移动到其他位置,只需在与删除相同的事务中执行插入/加载。只要没有对同一个uri应用插入/加载/删除,就不会发生冲突的更新,并且在代码成功结束时,所有更新都会持久存在。

您不是第一个想要在数据库中移动/重命名文档的人。这里链接到一个很好的帮助函数来移动数据库中的文档:

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

哦,顺便说一下,你的eval正在加载并删除相同的uri。这听起来好像改变了文件的含义......

HTH!