基于元素值筛选唯一XML段并映射至目标XML的IBM ESQL实现问题
IBM ACE 12中ESQL处理XML的去重筛选实现
需求说明
源XML结构
return (<Ins>节点可重复出现,<X>元素可能为空且值不唯一,<Y>元素始终有值: ```xml <Root> <Header/> )
```<Ins> <X/> <Y/> <Z/> </Ins>
目标XML结构
将符合条件的节点的
<Target> <C> <C1/> </C> </Target>
筛选条件
return (<X>值非空且**全局唯一** )return (<Y>值**全局唯一**且包含子串`something` )
现有代码问题
提供的代码仅实现了X非空、Y包含指定子串的判断,但未对X、Y的唯一性做校验,会导致重复的X/Y值被错误映射。
修正后的ESQL代码
DECLARE i INTEGER 1; DECLARE j INTEGER 1; -- 临时存储已出现的X值,以X值为键 DECLARE existingX REFERENCE TO Environment.Temp.ExistingX; -- 临时存储已出现的Y值,以Y值为键 DECLARE existingY REFERENCE TO Environment.Temp.ExistingY; -- 初始化临时存储结构 SET existingX = {}; SET existingY = {}; FOR source AS InputRoot.XMLNSC.Root.Ins[] DO DECLARE currentX CHAR; DECLARE currentY CHAR; DECLARE currentZ CHAR; SET currentX = COALESCE(source.X, ''); SET currentY = source.Y; -- Y始终有值,无需默认值处理 SET currentZ = COALESCE(source.Z, ''); -- 完整条件校验:X非空、Y含指定子串、X/Y均未重复 IF currentX <> '' AND CONTAINS(currentY, 'something') AND NOT EXISTS(existingX.(currentX)) AND NOT EXISTS(existingY.(currentY)) THEN -- 标记当前X/Y为已出现 SET existingX.(currentX) = 1; SET existingY.(currentY) = 1; -- 映射Z值到目标节点 SET OutputRoot.XMLNSC.Target.C[j].C1 = currentZ; SET j = j + 1; END IF; SET i = i + 1; END FOR; -- 清理临时环境变量(可选,防止残留数据影响后续流程) DELETE Environment.Temp;
代码逻辑说明
- 临时存储初始化:用
Environment.Temp下的两个引用节点,以键值对形式记录已处理过的X、Y值,实现高效的重复判断。 - 节点遍历与值提取:逐个读取节点的X、Y、Z值,Y因始终有值无需默认值处理。
- 完整条件校验:在原有基础上增加X/Y的唯一性判断,确保只有首次出现的符合条件的节点才会被处理。
- 结果映射与标记:符合条件的节点先标记X/Y为已出现,再将Z值映射到目标XML的
元素。 - 临时数据清理:遍历结束后删除临时存储,避免环境变量残留数据干扰后续流程。
内容的提问来源于stack exchange,提问作者ArpanMona
相关产品推荐
相关产品推荐

