1

我有一条 Soap 消息,其中包括 Soap 正文中的各种嵌套节点。我需要找到节点'xyz',但它并不总是在同一个位置。在 XSLT 世界中,我可以只使用 //xyz[1]。esql 有等效的语法吗?类似 OutputRoot.SOAP.Body{unknown syntax}.xyz[1]

4

3 回答 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 回答