Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xquery 如何在MarkLogic中重命名文档?_Xquery_Marklogic - Fatal编程技术网

Xquery 如何在MarkLogic中重命名文档?

Xquery 如何在MarkLogic中重命名文档?,xquery,marklogic,Xquery,Marklogic,我有一个简单的任务要做,但找不到确切的解决方案。我在MarkLogic中将一个文件保存为abc.xml。如何使用XQuery将该文件重命名为example.xml 我试过的代码: xquery version "1.0-ml"; xdmp:document-rename ("/aaa.xml","/final.xml"); 这显示了一个错误。据我所知,无法更改现有文档的文档URI。我能想到的唯一方法是在同一事务中创建一个具有相同内容和新URI的新文档,并删除现有文档 变得棘手的地方是确保保留所

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

我试过的代码:

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

这显示了一个错误。

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

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

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


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

Florent是正确的,真正的“重命名”是不可能的,甚至可能没有意义。(类比-将文件从一个磁盘重命名为另一个磁盘)

然而,“移动”是有意义的(在事务中复制然后删除)。 定义“移动”依赖于用例-即,什么metatdata也需要“移动”?权限?收藏?文档属性?继承的权限

xmlsh()为marklogic扩展实现了一个“rename”(重命名)命令,它实际上是一个“move”(移动),其实现借用了markmail()上的帖子

这个实现是下面的XQuery——它并不是做你想要的一切,它可能做的比你想要的更多。YMMV


(它也是很久以前写的,很可能会从改进中受益)

我有一个工作示例,这对我很有用


xquery版本“1.0-ml”

声明函数本地:文档重命名(
$old-uri作为xs:string,$new-uri作为xs:string)
作为空-sequence()
{
xdmp:文档删除($old uri),
让$permissions:=xdmp:文档获取权限($old uri)
让$collections:=xdmp:文档获取集合($old uri)
返回xdmp:文档插入(
$new uri,doc($old uri),
如果为($permissions),则为$permissions
else xdmp:default-permissions(),
如果为($collections),则为$collections
else xdmp:default-collections(),
xdmp:文档获取质量($old uri)
)
,
让$prop ns:=名称空间-uri()
让$properties:=
xdmp:文档属性($old uri)/node()
[名称空间uri(.)ne$prop ns]
返回xdmp:文档集属性($newURI,$properties)
};
(:函数调用:) 本地:文档重命名(“/opt/backup/x.xml”、“y.xml”);

感谢您包含URI不如XML本身的标记重要的部分。Is是通过搜索(如CTS:SEARCH)而不是通过URI(如fn:doc)(“/thisfile.xml”)获取信息的良好实践。
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)
};