【发布时间】:2014-05-26 09:30:20
【问题描述】:
我有一条 Soap 消息,其中包括 Soap 正文中的各种嵌套节点。我需要找到节点'xyz',但它并不总是在同一个位置。在 XSLT 世界中,我可以只使用 //xyz[1]。 esql 有等效的语法吗?类似 OutputRoot.SOAP.Body{unknown syntax}.xyz[1]
【问题讨论】:
标签: soap messagebroker ibm-integration-bus extended-sql
我有一条 Soap 消息,其中包括 Soap 正文中的各种嵌套节点。我需要找到节点'xyz',但它并不总是在同一个位置。在 XSLT 世界中,我可以只使用 //xyz[1]。 esql 有等效的语法吗?类似 OutputRoot.SOAP.Body{unknown syntax}.xyz[1]
【问题讨论】:
标签: soap messagebroker ibm-integration-bus extended-sql
我认为 ESQL 中没有任何与 xpath '//' 语法等效的东西。如果您需要它来使用它来访问一个值,您可以使用 JavaCompute 节点(请参阅evaluateXpath)。或者,您可以在 ESQL 中编写递归函数来访问所有节点并测试名称。有关示例,请参阅 Infocenter 中的 CREATE FUNCTION 文章。
【讨论】:
如果它在层次结构上始终处于同一级别,那么您可以使用匿名引用。
我使用以下代码获取 XML 中的 Xyz 值。
-- Walk all the second level aggregates looking for any that contain the Xyz tag
DECLARE AnonRef REFERENCE TO InputRoot.XMLNSC.*:HasAggregatesWithXyz.*:*[1];
WHILE(LASTMOVE(AnonRef)) DO
DECLARE XyzRef REFERENCE TO AnonRef.*:Xyz[1];
IF(LASTMOVE(XyzRef)) THEN
-- Do something with the value of Xyz
DECLARE CharVal CHAR FIELDVALUE(XyzRef);
END IF;
MOVE AnonRef NEXTSIBLING;
END WHILE;
<HasAggregatesWithXyz>
<Agg1><NotXyz>NotNot</NotXyz></Agg1>
<Agg2><Xyz>XyzValue1</Xyz></Agg2>
<Agg3><NotXyz>NotNot</NotXyz></Agg3>
<Agg4><Xyz>XyzValue2</Xyz></Agg4>
</HasAggregatesWithXyz>
注意:根据您选择的 XMLNSC 解析选项,特别是与保留空白有关的任何事情,您可能希望使您的参考更加具体。为此,您可以使用如下类型。
DECLARE AnonRef REFERENCE TO InputRoot.XMLNSC.*:HasAggregatesWithXyz.(XMLNSC.Folder)*:*[1];
....
MOVE AnonRef NEXTSIBLING REPEAT TYPE;
【讨论】:
正如 TJA 所说,您可以像这样简单地使用匿名引用:
InputRoot.SOAP.Body.*[1].sender
【讨论】: