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

基于BPM工具的包装API开发:XQuery逻辑验证问题排查

修复XQuery结构转换代码的验证问题

我正在基于类BPM工具开发包装API,该API需要内部调用另一外部API;当外部API返回多份响应时,需遍历所有响应并转换为指定结构输出。我编写了XQuery逻辑来处理响应转换,但遇到了验证问题,且表达式编辑器未提供详细错误信息。

原代码

declare variable $externalApiResponse := $temp.tmp_infaSearchResult ;  

let $targetStructure := object {
  "searchResult": object {
    "totalRecords": xs:double(0),  
    "records": array {}
  }
}

(: Set totalRecords based on the number of responses from the external API :)
let $totalRecords := count($externalApiResponse)
return
if ($totalRecords > 0) then
  (: Loop over each response from the external API :)
  for $response in $externalApiResponse
  return
    (
      (: Create a record for each response :)
      let $record := object {
        "metaData": object {
          "score": xs:double($response/score),
          "businessId": $response/businessId,
          "xrefSourceSystem": $response/xrefSourceSystem,
          "xrefSourcePKey": $response/xrefSourcePKey
        },
        "data": object {
          "name": $response/name,
          "postalAddress": array {
            (
              (: Loop over each address in the response :)
              for $address in $response/postalAddress
              return
                object {
                  "addressLine1": $address/addressLine1,
                  "city": $address/city,
                  "country": object {
                    "Code": $address/country/Code,
                    "Name": $address/country/Name
                  },
                  "postalCode": $address/postalCode
                }
            )
          },
          "taxDetail": array {
            (
              (: Loop over each tax detail in the response :)
              for $taxDetail in $response/taxDetail
              return
                object {
                  "taxNumber": $taxDetail/taxNumber
                }
            )
          }
        }
      }
      return insert into $targetStructure.searchResult.records ( $record )
    )

return $targetStructure

问题分析

  • 语法错误:多个顶级return语句:原代码存在两个独立的return分支,违反XQuery语法规范,主表达式只能有一个顶级return。
  • 错误使用insert into:XQuery是函数式语言,变量不可变,不能通过insert into修改已定义的对象/数组,必须通过构造新结构生成结果。
  • 冗余条件判断:无需先判断响应数量是否大于0,空响应集合会自动生成空的records数组。

修正后的代码

declare variable $externalApiResponse := $temp.tmp_infaSearchResult ;  

let $totalRecords := count($externalApiResponse)
(: 直接构造完整目标结构,一次性生成所有转换后的记录 :)
let $targetStructure := object {
  "searchResult": object {
    "totalRecords": xs:double($totalRecords),  
    "records": array {
      for $response in $externalApiResponse
      return object {
        "metaData": object {
          "score": xs:double($response/score),
          "businessId": $response/businessId,
          "xrefSourceSystem": $response/xrefSourceSystem,
          "xrefSourcePKey": $response/xrefSourcePKey
        },
        "data": object {
          "name": $response/name,
          "postalAddress": array {
            for $address in $response/postalAddress
            return object {
              "addressLine1": $address/addressLine1,
              "city": $address/city,
              "country": object {
                "Code": $address/country/Code,
                "Name": $address/country/Name
              },
              "postalCode": $address/postalCode
            }
          },
          "taxDetail": array {
            for $taxDetail in $response/taxDetail
            return object {
              "taxNumber": $taxDetail/taxNumber
            }
          }
        }
      }
    }
  }
}

return $targetStructure

修改说明

  1. 合并所有逻辑到单个主FLWOR表达式中,确保只有一个顶级return,符合XQuery语法要求。
  2. 在records数组的构造逻辑中直接遍历外部API响应,一次性生成所有转换后的记录对象,避免错误的可变操作。
  3. 直接将totalRecords赋值为响应数量,空响应时自动设置为0,去掉冗余的条件判断。
  4. 简化数组内部循环结构,移除冗余括号,提升代码可读性。

内容的提问来源于stack exchange,提问作者Prasad Kada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:41:22