我有一条 Soap 消息,其中包括 Soap 正文中的各种嵌套节点。我需要找到节点'xyz',但它并不总是在同一个位置。在 XSLT 世界中,我可以只使用 //xyz[1]。esql 有等效的语法吗?类似 OutputRoot.SOAP.Body{unknown syntax}.xyz[1]
问问题
5699 次
3 回答
2
我认为在 ESQL 中没有任何等效于 xpath '//' 语法的东西。如果您需要它来使用它来访问一个值,您可以使用 JavaCompute 节点(请参阅evaluateXpath)。或者,您可以在 ESQL 中编写递归函数来访问所有节点并测试名称。有关示例,请参阅 Infocenter 中的 CREATE FUNCTION 文章。
于 2014-04-17T22:38:23.290 回答
1
如果它始终处于同一层次,那么您可以使用匿名引用。
我使用以下代码获取 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;
于 2014-05-02T04:47:32.203 回答
1
正如 TJA 所说,您可以像这样简单地使用匿名引用:
InputRoot.SOAP.Body.*[1].sender
于 2016-10-11T14:19:01.980 回答