1

我有几个 Soap 输入,并想根据 Payload 中元素的存在来决定我的 Mule Flow 中的行动方案。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xyz="http://xyz.abc.com/">
  <soapenv:Header/>
  <soapenv:Body>
    <xyz:myFirst/>
  </soapenv:Body>
</soapenv:Envelope>


<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xyz="http://xyz.abc.com/">
  <soapenv:Header/>
  <soapenv:Body>
    <xyz:mySecond>
        Something here
    </xyz:mySecond>
  </soapenv:Body>
</soapenv:Envelope>

在上述有效载荷中,如果存在“myFirst”,我想走一条路线,如果存在“mySecond”,则走另一条路线。

我尝试了以下

<choice>
  <when expression="#[xpath('fn:count(//soapenv:Envelope/soapenv:Body/xyz:myFirst/child::text())') != 0]">
    //Do something First Here
  </when>
  <when expression="#[xpath('fn:count(//soapenv:Envelope/soapenv:Body/xyz:mySecond/child::text())') != 0]">
    //Do something Second Here
  </when>
  <otherwise>
    //Didn't match any!
  </otherwise>
</choice>

但是“myFirst”永远不会被识别,因为它是空的。我尝试了这个位置提到的使用 XPath 来检查 Soap Envelope 是否包含子节点,但无济于事。我当前的尝试是基于如何使用 XPath 判断元素是否存在且非空?.

想法?

4

1 回答 1

1

在您XPath正在测试的情况child text node下,如果您在示例有效负载中有一个空节点,这就是为什么它永远不会成为首选元素的原因。如果目的是在节点为空的情况下执行任务,请执行以下操作:

<choice>
  <when expression="#[xpath('fn:count(//soapenv:Envelope/soapenv:Body/xyz:myFirst)') != 0]">
    //Do something First Here
  </when>
  <when expression="#[xpath('fn:count(//soapenv:Envelope/soapenv:Body/xyz:mySecond') != 0]">
    //Do something Second Here
  </when>
  <otherwise>
    //Didn't match any!
  </otherwise>
</choice>
于 2013-10-13T01:27:45.397 回答