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

如何在IBM Integration Bus中循环映射环境变量至消息组装

解决IIB Compute节点中ESQL遍历多ListDocs节点的问题

你在IBM Integration Bus(IIB)Compute节点里遇到的循环失效问题,核心是原代码的循环逻辑和节点访问方式有误,导致没法正确遍历所有ListDocs节点。咱们来一步步修正:

原代码的核心问题

  • 循环条件错误:直接用节点对象作为循环判断条件,而非节点的总数量,导致循环无法正常启动或终止
  • 未通过索引定位节点:没有用[I]索引区分不同的ListDocs节点,每次赋值都会覆盖同一个变量
  • 路径与拼写问题:代码里的节点路径存在名称不一致(listaTiposDocumentos vs listDocs),还有属性拼写错误(atribbute→attribute、lenght→length)

修正后的ESQL代码示例

首先确保在Compute节点的ESQL开头声明对应命名空间(替换成你的实际命名空间URL):

DECLARE ns NAMESPACE 'http://your-soap-namespace-url';
DECLARE ns75 NAMESPACE 'http://your-ns75-namespace-url';

然后用正确的循环逻辑遍历所有ListDocs节点:

-- 指向所有listDocs节点的集合
DECLARE listDocsRef REFERENCE TO InputRoot.SOAP.Body.ns:obterTiposDocProcessosResponse.ns:return.ns75:processo.ns75:listaTiposDocumentos.ns75:listDocs;
DECLARE I INTEGER 1;
-- 获取listDocs节点的总数量
DECLARE totalDocs INTEGER CARDINALITY(listDocsRef[]);

-- 初始化Environment中的目标数组结构
DECLARE envTargetRef REFERENCE TO Environment.Variables.XMLMessage.return.process;
CREATE LASTCHILD OF envTargetRef NAME 'listDocs' AS ARRAY;

WHILE I <= totalDocs DO
    -- 定位到当前遍历的第I个listDocs节点
    SET CURRENTREF TO listDocsRef[I];
    
    -- 在Environment中创建新的listDocs子节点
    DECLARE newDocRef REFERENCE TO CREATE LASTCHILD OF envTargetRef.listDocs NAME 'listDocs';
    
    -- 映射当前节点的基础属性
    SET newDocRef.description = CURRENTREF.ns75:description;
    SET newDocRef.tipoDocumento = CURRENTREF.ns75:DocType;
    
    -- 处理ListTypes子属性
    DECLARE listTypesRef REFERENCE TO CURRENTREF.ns75:listTypes;
    CREATE LASTCHILD OF newDocRef NAME 'listTypes';
    SET newDocRef.listTypes.attribute = listTypesRef.ns75:attribute;
    SET newDocRef.listTypes.length = listTypesRef.ns75:length;
    SET newDocRef.listTypes.description = listTypesRef.ns75:description;
    SET newDocRef.listTypes.nature = listTypesRef.ns75:nature;
    SET newDocRef.listTypes.required = listTypesRef.ns75:required;
    
    SET I = I + 1;
END WHILE;

关键说明

  • 用CARDINALITY获取节点总数:CARDINALITY(listDocsRef[])会返回listDocs节点的总个数,作为循环的终止条件
  • 索引访问单个节点:通过listDocsRef[I]定位到第I个节点,确保每次遍历的是不同的ListDocs实例
  • 创建数组型目标节点:在Environment中声明ARRAY类型的listDocs,这样每个遍历的节点都会作为新子节点添加,不会覆盖原有内容
  • 修正拼写错误:原代码里的属性拼写错误会导致映射失败,必须修正为正确的属性名

这样修改后,就能完整遍历所有ListDocs节点并完成变量映射,后续的Mapping节点也能正确处理这些重复结构。

内容的提问来源于stack exchange,提问作者Programmer Master

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:40