我有简单的任务要做但无法找到确切的解决方案。我在MarkLogic中将文件保存为abc.xml。如何使用XQuery将文件重命名为example.xml?
我尝试的代码:
xquery version "1.0-ml";
xdmp:document-rename ("/aaa.xml","/final.xml");
这显示错误。
答案 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
(很久以前也写过 - 它可能会从改进中受益)
答案 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)
};