我面临 ESQL 代码的挑战。我有一条包含重复段的 XML 消息,我需要从该段内的特定元素中提取唯一值。以下是输入 XML 消息,
<MSG>
<RecurringSegment>
<Element>val1</Element>
</RecurringSegment>
<RecurringSegment>
<Element>val2</Element>
</RecurringSegment>
<RecurringSegment>
<Element>val1</Element>
</RecurringSegment>
<RecurringSegment>
<Element>val3</Element>
</RecurringSegment>
<!-- ... (more recurring segments) ... -->
</MSG>
我编写了以下 ESQL 代码,该代码循环访问重复段,识别特定元素内的唯一值(例如,
<Element>
),并将它们存储在输出变量中。
DECLARE uniqueVals ROW;
DECLARE i INTEGER 1;
FOR obj AS InputRoot.XMLNSC.MSG.RecurringSegment[] DO
IF (NOT(CONTAINS(uniqueVals, obj.Element))) THEN
SET uniqueVals.val[i] = obj.Element;
SET i = i + 1;
END IF;
END FOR;
但这不起作用;需要 ESQL 代码的帮助才能实现此目的。
CONTAINS 函数 仅适用于字符串数据类型(BIT、BLOB、CHAR),不适用于 ROW。
如果您没有太多唯一值,以下方法效果很好:
DECLARE occurences ROW;
DECLARE i INTEGER 1;
FOR obj AS InputRoot.XMLNSC.MSG.RecurringSegment[] DO
DECLARE val CHAR obj.Element;
IF COALESCE(occurences.{val}, 0) = 0 THEN
SET occurences.{val} = 1;
ELSE
SET occurences.{val} = occurences.{val} + 1;
END IF;
END FOR;
FOR obj AS occurences.*[] DO
IF FIELDVALUE(obj) > 1 THEN
CREATE LASTCHILD OF OutputRoot.XMLNSC.Result
NAME FIELDNAME(obj) VALUE FIELDVALUE(obj);
END IF;
END FOR;
根据您的输入,将产生以下结果:
<Result>
<val1>2</val1>
</Result>
这种编程风格对于许多唯一值来说效率不高,因为
occurences.{val}
不像哈希映射那样由 ESQL 实现。
要求是找到唯一的值。稍微调整丹尼尔·斯坦曼的答案......
DECLARE uniqueValues ROW;
FOR obj AS InputRoot.XMLNSC.MSG.RecurringSegment[] DO
DECLARE val CHAR obj.Element;
IF ( EXISTS(uniqueValues .{val}[]) ) THEN
CREATE LASTCHILD OF uniqueValues TYPE Name NAME val
END IF;
END FOR;
SET OutputRoot.XMLNSC.Result[] = uniqueValues.*[];
无法对此进行测试,因此对于任何逻辑/语法错误,我深表歉意。