Я изучаю шаблоны ESO WSO2, и у меня есть некоторые сомнения, читая официальную документацию шаблона splitter (https://docs.wso2.com/display/IntegrationPatterns/Splitter)
С теоретической точки зрения ясно, чтоУ меня есть некоторые сомнения по поводу реализации, предложенной примером.
Это определение прокси-сервера, содержащего последовательность, реализующую шаблон splitter :
<definitions xmlns="http://ws.apache.org/ns/synapse">
<proxy name="SplitMessageProxy" transports="http https" startOnLoad="true">
<target>
<inSequence>
<log level="full"/>
<iterate xmlns:m0="http://services.samples"
preservePayload="true"
attachPath="//m0:getQuote"
expression="//m0:getQuote/m0:request">
<target>
<sequence>
<send>
<endpoint>
<address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
</endpoint>
</send>
</sequence>
</target>
</iterate>
</inSequence>
<outSequence>
<drop/>
</outSequence>
</target>
<publishWSDL uri="file:repository/samples/resources/proxy/sample_proxy_1.wsdl"/>
</proxy>
<sequence name="fault">
<log level="full">
<property name="MESSAGE" value="Executing default "fault" sequence"/>
<property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
<property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
</log>
<drop/>
</sequence>
<sequence name="main">
<in/>
<out/>
</sequence>
</definitions>
Тогда это SOAP-запрос отправляется на прокси-сервер previus:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.samples" xmlns:xsd="http://services.samples/xsd">
<soapenv:Header/>
<soapenv:Body>
<ser:getQuote>
<ser:request>
<xsd:symbol>IBM</xsd:symbol>
</ser:request>
<ser:request>
<xsd:symbol>WSO2</xsd:symbol>
</ser:request>
<ser:request>
<xsd:symbol>IBM</xsd:symbol>
</ser:request>
</ser:getQuote>
</soapenv:Body>
</soapenv:Envelope>
Хорошо, поэтому посредник Iterate принимает каждый дочерний элемент элемента, указанного в его выражении XPath, и применяетпоток последовательности внутри посредника итератора ... так что в этом случае он выполняет итерацию по всем дочерним элементам XPATH-выражения , определяемого как: // m0: getQuote / m0: request , чтодолжен быть следующий тег XML:
<xsd:symbol>IBM</xsd:symbol>
и
<xsd:symbol>WSO2</xsd:symbol>
и
<xsd:symbol>IBM</xsd:symbol>
Сомнение в этом выражении XPATH:
выражение XPATH равно // m0: getQuote / m0: требуемыйй .Почему в этом примере он добавляет пространство имен m0 перед элементом XML?Почему выражение не является чем-то // ser: getQuote / ser: request (используя пространство имен, определенное внутри запроса XML, поступающего в поток ESB)?