XPath выражение в медиаторе фильтра - PullRequest
1 голос
/ 28 октября 2019

Я использую WSO2 ESB для обработки и распространения HL7. Я хочу фильтровать HL7 по его содержанию. Передача сообщений в ESB:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<hl7:message xmlns:hl7="http://wso2.org/hl7">
<ADT_A01 xmlns="urn:hl7-org:v2xml">
    <MSH>
        <MSH.1>|</MSH.1>
        <MSH.2>^~\&amp;</MSH.2>
        <MSH.3>
            <HD.1>HL7Soup</HD.1>
        </MSH.3>
        <MSH.4>
            <HD.1>Instance1</HD.1>
        </MSH.4>
        <MSH.5>
            <HD.1>HL7Soup</HD.1>
        </MSH.5>
        <MSH.6>
            <HD.1>Instance2</HD.1>
        </MSH.6>
        <MSH.7>
            <TS.1>200808181126</TS.1>
        </MSH.7>
        <MSH.8>SECURITY</MSH.8>
        <MSH.9>
            <MSG.1>ADT</MSG.1>
            <MSG.2>A04</MSG.2>
        </MSH.9>
        <MSH.10>MSG00001</MSH.10>
        <MSH.11>
            <PT.1>P</PT.1>
        </MSH.11>
        <MSH.12>
            <VID.1>2.5.1</VID.1>
        </MSH.12>
    </MSH>
    ...................
    </ADT_A01.INSURANCE>
</ADT_A01></hl7:message></soapenv:Body></soapenv:Envelope>

Я бы хотел фильтровать сообщения HL7 по содержанию. Если ДОПОЛНИТЕЛЬНО ОК, ПРОЧЕЕ Бросьте это. Я попытался с помощью следующего фильтра-посредника, но он не работает. Он всегда идет в ветку else:

<filter regex=".*ADT.*" source="//MSG.1[1]">
    <then>
        <log level="custom">
            <property name="ADT" value="Oui"/>
        </log>
    </then>
    <else>
        <log level="custom">
            <property name="ADT" value="Non"/>
        </log>
    </else>
</filter>

Выражение xpath работает в онлайн-тестере как https://www.freeformatter.com/xpath-tester.html Что не так?

1 Ответ

1 голос
/ 28 октября 2019

Пожалуйста, используйте следующий прокси для вашего случая использования.

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="filter-hl7"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="http,https">
   <target>
      <inSequence>
         <log level="custom">
            <property name="log1" value="API invoked"/>
         </log>
         <filter xmlns:hl7="http://wso2.org/hl7"
                 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                 xpath="contains(name(//soapenv:Envelope/soapenv:Body/hl7:message/*),'ADT')">
            <then>
               <log level="full">
                  <property name="log2" value="######### Xpath matched!"/>
               </log>
            </then>
            <else>
               <log level="full">
                   <property name="log3" value="########## Xpath did not match!"/>
               </log>
            </else>
         </filter>
         <respond/>
      </inSequence>
      <outSequence/>
      <faultSequence/>
   </target>
   <description/>
</proxy>

Этот Xpath работает в прокси.

contains(name(//soapenv:Envelope/soapenv:Body/hl7:message/*),'ADT')
...