You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:40:29