MarkLogic转换函数能否返回双文档节点或原内容+自定义响应节点?
需求实现方案
核心思路
可以实现,关键是分离文档插入操作与函数返回值,同时用try/catch处理转换异常,调整函数返回类型避免类型不匹配错误。
具体实现步骤
- 优先执行原始二进制文档的插入:无论转换成功与否,都先调用
xdmp:document-insert()将原始文档写入数据库,这一步独立于转换逻辑。 - 用
try/catch包裹转换与转换后文档插入逻辑:- 转换成功时,插入转换后的文档,返回成功格式的响应节点
- 转换失败时,直接返回预先定义的错误响应节点
- 调整函数返回类型:将原本的
document-node()改为element()(或更通用的item()),确保函数始终返回单个节点,避免XDMP-AS类型错误。
示例代码
declare function local:process-content($uri as xs:string, $binary as binary()) as element() { -- 插入原始二进制文档,这一步无条件执行 xdmp:document-insert($uri, $binary, (), "original-binary-collection"), let $result := try { -- 尝试过滤转换二进制文档 let $filtered-doc := xdmp:document-filter($binary) -- 生成转换后文档的URI(示例:替换后缀为xml) let $filtered-uri := replace($uri, '\.[^\.]+$', '.xml') -- 插入转换后的文档 xdmp:document-insert($filtered-uri, $filtered-doc, (), "filtered-docs-collection") -- 构造成功响应 <nifi-response status="success"> <detail>原始文档已保存,转换后文档已生成</detail> <original-uri>{$uri}</original-uri> <filtered-uri>{$filtered-uri}</filtered-uri> </nifi-response> } catch ($error) { -- 构造转换失败时的指定响应 <nifi-response status="failure"> <detail>原始文档已保存,但转换操作失败</detail> <original-uri>{$uri}</original-uri> <error-code>{$error/code}</error-code> <error-message>{$error/message}</error-message> </nifi-response> } return $result };
关键说明
- 无需将原始文档作为返回值返回:NiFi只需要接收响应节点即可,原始文档的持久化通过
xdmp:document-insert()直接完成,不依赖函数返回内容。 - 函数返回类型统一:始终返回单个
<nifi-response>元素,完全符合类型约束,不会触发XDMP-AS错误。
内容的提问来源于stack exchange,提问作者Shabana
相关产品推荐
相关产品推荐

