如何在MarkLogic中重命名文档?

时间:2015-05-08 06:28:46

标签: xquery marklogic

我有简单的任务要做但无法找到确切的解决方案。我在MarkLogic中将文件保存为abc.xml。如何使用XQuery将文件重命名为example.xml?

我尝试的代码:

xquery version "1.0-ml";
xdmp:document-rename ("/aaa.xml","/final.xml");

这显示错误。

3 个答案:

答案 0 :(得分:5)

我知道,改变现有文档的文档URI是没有办法的。我能想到的唯一方法是在同一个事务中创建一个具有相同内容和新URI的新文档,并删除现有文档。

它变得棘手的是确保保留所有权,权限,所有属性,属性文档,确保旧URI不用于任何地方链接到现有文档等。

但通常,文档URI从未真正使用过。您应首先考虑是否确实需要重命名文档,以及原因。

(请注意,如果您没有显示错误是什么,说“这显示错误”在SO或邮件列表上很少有用。)

答案 1 :(得分:4)

弗洛朗是正确的,真正的重命名'是不可能的,或者甚至可能没有意义。 (比喻 - 将文件从一个磁盘重命名为另一个磁盘)

"移动"但是有意义(复制然后在事务中删除)。 定义"移动"是用例依赖 - 即metatdata还需要移动' ?权限?收藏?文件属性?继承权限?

xmlsh(http://www.xmlsh.org)实现了'重命名' (http://www.xmlsh.org/MarkLogicRename)命令用于marklogic扩展,这实际上是一个'移动',借用了在markmail上发布的实现(http://markmail.org/

实现是以下XQuery - 它不会执行您可能想要的所有操作,它可能会执行您想要的更多操作。 YMMV

https://github.com/DALDEI/xmlsh/blob/master/extensions/marklogic/src/org/xmlsh/marklogic/resources/rename.xquery

(很久以前也写过 - 它可能会从改进中受益)

答案 2 :(得分:0)

我有工作的例子这对我有用。

xquery version "1.0-ml";

declare function local:document-rename(
$old-uri as xs:string, $new-uri as xs:string)
as empty-sequence()
{
    xdmp:document-delete($old-uri),
    let $permissions := xdmp:document-get-permissions($old-uri)
    let $collections := xdmp:document-get-collections($old-uri)
    return xdmp:document-insert(
      $new-uri, doc($old-uri),
      if ($permissions) then $permissions
      else xdmp:default-permissions(),
      if ($collections) then $collections
      else xdmp:default-collections(),
      xdmp:document-get-quality($old-uri)
     )
     ,
    let $prop-ns := namespace-uri(<prop:properties/>)
    let $properties :=
    xdmp:document-properties($old-uri)/node()
    [ namespace-uri(.) ne $prop-ns ]
    return xdmp:document-set-properties($new-uri, $properties)
};

declare function local:document-rename( $old-uri as xs:string, $new-uri as xs:string) as empty-sequence() { xdmp:document-delete($old-uri), let $permissions := xdmp:document-get-permissions($old-uri) let $collections := xdmp:document-get-collections($old-uri) return xdmp:document-insert( $new-uri, doc($old-uri), if ($permissions) then $permissions else xdmp:default-permissions(), if ($collections) then $collections else xdmp:default-collections(), xdmp:document-get-quality($old-uri) ) , let $prop-ns := namespace-uri(<prop:properties/>) let $properties := xdmp:document-properties($old-uri)/node() [ namespace-uri(.) ne $prop-ns ] return xdmp:document-set-properties($new-uri, $properties) };