如何在IBM Integration Bus中循环映射环境变量至消息组装
解决IIB Compute节点中ESQL遍历多ListDocs节点的问题
你在IBM Integration Bus(IIB)Compute节点里遇到的循环失效问题,核心是原代码的循环逻辑和节点访问方式有误,导致没法正确遍历所有ListDocs节点。咱们来一步步修正:
原代码的核心问题
- 循环条件错误:直接用节点对象作为循环判断条件,而非节点的总数量,导致循环无法正常启动或终止
- 未通过索引定位节点:没有用
[I]索引区分不同的ListDocs节点,每次赋值都会覆盖同一个变量 - 路径与拼写问题:代码里的节点路径存在名称不一致(
listaTiposDocumentosvslistDocs),还有属性拼写错误(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
相关产品推荐
相关产品推荐

