我在xquery中编写了一个转换,该转换取消了XML-String的引用,并插入了包含其内容的元素。这很好。 我还需要创建一个依赖于该元素的根元素的集合。我无法在新文档上执行此操作,因为xdmp:document-add-collections()无法正常工作。如何在转换中将集合添加到新文档中?
这是我的ServerSide xQuery代码:
xquery version "1.0-ml";
module namespace transform = "http://marklogic.com/rest-api/transform/smtextdocuments";
import module namespace mem = "http://xqdev.com/in-mem-update" at '/MarkLogic/appservices/utils/in-mem-update.xqy';
declare function transform(
$context as map:map,
$params as map:map,
$content as document-node()
) as document-node()
{
let $uri := base-uri($content)
let $doccont := $content/smtextdocuments/documentcontent
let $newcont := xdmp:unquote($doccont)
let $contname := node-name($newcont/*)
let $result := if ( exists($content/smtextdocuments/content))
then mem:node-replace($content/smtextdocuments/content, <content>11{$newcont}</content>)
else mem:node-insert-after($doccont, <content>{$newcont}</content>)
let $log := xdmp:log($content)
return (
$result,
xdmp:document-add-collections($uri, fn:string($contname)),
xdmp:document-remove-collections($uri, "raw")
)
};
运行Java api(4.0.4)的脚本ist通过参数ServerTransform transform创建方法。根据文档,转换脚本在文档存储在数据库中之前就已运行。
它是一个新文件;我需要转换内容,然后创建集合。
创建后我可以看到文档,内容可用。只是集合丢失了。我可以尝试使用xdmp:document-insert方法,但是在create运行时编写文档是否正确?
答案 0 :(得分:4)
Java API / REST API的转换机制负责文档的编写。目前,转换无法将集合提供给作者。那是一个合理的增强要求。
转换不应尝试编写文档,因为编写者还将尝试编写同一文档。
一种选择是在编写文档之前先用Java对其进行转换,然后将集合指定为写请求的一部分。
另一种替代方法是将转换重写为资源服务扩展,在资源服务扩展内实现写入,并修改Java客户端以将文档发送到资源服务扩展。
根据模型,最后的替代方法可能是在文档中的元素上使用范围索引以将文档收集为集合,而不是在文档上使用集合。
希望有帮助,
答案 1 :(得分:0)
“新文件”是什么意思?调整文档集合时,文档是否已插入MarkLogic数据库?否则,您可能需要针对这种情况修改对($result, xdmp:document-insert($uri, $result, xdmp:default-permissions(), fn:string($contname)) )
的返回。
否则,您可以编辑问题以更具体地分享您所面临的错误或问题吗?
答案 2 :(得分:0)
很遗憾,REST转换不允许这样做,就像MLCP转换一样。在更改之前,您可以使用ehennum绘制的选项,或者可以考虑延迟将集合添加到提交前或提交后的触发器。这会花费一些开销,但是在触发器中执行类似的操作有时很有意义,因为它确保始终执行该操作,并且是进行内容验证,审核日志记录以及类似操作的好地方。 >
HTH!