Как преобразовать сообщение с помощью XQuery в WSO2WSB 4.8.0

Я использую Wso2esb4.8.0. Я хочу преобразовать сообщения в соответствии с требованиями запроса адаптера. Мои входящие сообщения различными способами. Нравиться

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:open="http://www.openuri.org/" xmlns:env="http://eai.mmn.gg/Envelope"  xmlns:par="http://eai.mm.gg/par">
    <soapenv:Header/>
    <soapenv:Body>
        <open:clientRequest>
            <env:EaiEnvelope>
                <env:Domain>1</env:Domain>
                <env:Service>par</env:Service>
                <env:ServiceId>1</env:ServiceId>
                <env:Language>En</env:Language>
                <env:uiId>sd</env:uiId>
                <env:sid>sd</env:sid>
                <env:MessageId>2210201395544</env:MessageId>
                <env:CorrelationId>1</env:CorrelationId>
                <env:GenTimeStamp>1</env:GenTimeStamp>
                <env:SentTimeStamp>1</env:SentTimeStamp>
                <env:Payload>
                    <par:par>
                        <par:Request>
                            <par:Operation_Name>getv</par:Operation_Name>
                        </par:Request>
                    </par:par>
                </env:Payload>
            </env:EaiEnvelope>
        </open:clientRequest>
    </soapenv:Body>
</soapenv:Envelope>

Над одним находится 1 тип сообщения для каждого сообщения. Пространство имен будет изменено. Еще один пример сообщения запроса, подобного этому. Таким образом, у нас есть 10-15 сообщений запроса.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:open="http://www.openuri.org/" xmlns:env="http://eai.mmn.gg/Envelope"  xmlns:acc="http://eai.mm.gg/accounts">
    <soapenv:Header/>
    <soapenv:Body>
        <open:clientRequest>
            <env:EaiEnvelope>
                <env:Service>par</env:Service>
                <env:Language>En</env:Language>
                <env:uiId>sd</env:uiId>
                <env:sid>sd</env:sid>
                <env:MessageId>2210201395544</env:MessageId>
                <env:CorrelationId>1</env:CorrelationId>
                <env:GenTimeStamp>1</env:GenTimeStamp>
                <env:SentTimeStamp>1</env:SentTimeStamp>
                <env:Payload>
                    <acc:par>
                        <acc:Request>
                            <acc:CustDetails_InputData> 
                                <acc:MSISDN>989105496</acc:MSISDN>
                            </acc:CustDetails_InputData>
                            <acc:Operation_Name>getv</acc:Operation_Name>
                        </acc:Request>
                    </acc:par>
                </env:Payload>
            </env:EaiEnvelope>
        </open:clientRequest>
    </soapenv:Body>
</soapenv:Envelope>

В каждой полезной нагрузке данные постоянно меняются, поэтому требуется написать один Xquery для всех запросов на преобразование в желаемый формат. Выведите это сообщение выше после преобразования Xquery.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:open="http://www.openuri.org/" xmlns:acc="http://eai.mm.kman/acf">
    <soapenv:Header/>
    <soapenv:Body>
        <open:getv>
            <acc:acf>
                <!--You have a CHOICE of the next 3 items at this level-->
                <acc:Request>
                    <acc:Operation_Name>getv</acc:Operation_Name>
                    <acc:BasicInfo>
                        <acc:Language>En</acc:Language>
                        <acc:h>sd</acc:h>
                        <acc:sid>sd</acc:sid>
                        <acc:MessageId>2210201395544</acc:MessageId>
                        <acc:Operation>getv</acc:Operation>
                    </acc:BasicInfo>
                    <acc:CustDetails_InputData> 
                        <acc:MSISDN>989352105496</acc:MSISDN>
                    </acc:CustDetails_InputData>
                </acc:Request>
            </acc:acf>
        </open:getv>
    </soapenv:Body>  
</soapenv:Envelope>

Еще одно сообщение запроса Вывод после преобразования XQuery.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:open="http://www.openuri.org/" xmlns:par="http://eai.mm.kman/par">
    <soapenv:Header/>
    <soapenv:Body>
        <open:getv>
            <par:par>
                <par:Request>
                    <par:BasicInfo>
                        <par:Language>En</par:Language>
                        <par:uiId>sd</par:uiId>
                        <par:sid>sd</par:sid>
                        <par:MessageId>201395544</par:MessageId>
                        <par:Operation>getv</par:Operation>
                    </par:BasicInfo>
                    <par:Operation_Name>getv</par:Operation_Name>
                </par:Request>
            </par:par>
        </open:getv>
    </soapenv:Body>
</soapenv:Envelope>

Для этого я старался изо всех сил, но я не могу его получить. Я пробовал так, как показано ниже. Моя конфигурация ниже: XQuery

  <x xmlns="http://ws.apache.org/ns/synapse">
<![CDATA[
  declare namespace soapenv = "http://schemas.xmlsoap.org/soap/envelope";
  declare namespace open="http://www.openuri.org/";
       {
  element {$POS}{
  element {$Req_1}{
  element {fn:concat(prefix-from-QName(node-name($payload/*[1])),':hh')}{

  }
  }
  }
]]></x>

Но я получаю сообщения об ошибках в журнале wso2esb. Моя конфигурация прокси-сервера — Proxy.

<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="XQueryPOC" transports="https,http" statistics="disable" trace="disable" startOnLoad="true">
    <target>
        <inSequence>
            <log level="full">
                <property name="LOG" value="LOG"/>
            </log>

            <log level="full"/>
        </inSequence>
        <outSequence/>
    </target>
    <description/>
</proxy>

Итак, как мне добиться этого с помощью XQuery. Пространство имен для каждого запроса меняется, поэтому нам нужно объявить его динамическим. Некоторое тело, пожалуйста, помогите мне в этом.

Заранее спасибо.


person user3595078    schedule 19.05.2014    source источник
comment
Я также пробовал с этим //env:eaienvelope/(* кроме env:Payload))}   -  person user3595078    schedule 19.05.2014


Ответы (1)


Я сделал это. Таким образом, мы можем сформировать вышеуказанный формат для различных входов.

<

x xmlns="http://ws.apache.org/ns/synapse">

  declare namespace xs = "http://www.w3.org/2001/XMLSchema";
  declare namespace env="http://eai.im.ii/Envelope";
  declare variable $open as xs:string+:="http://www.openuri.org/";
  declare variable $ServicePrefix as xs:string+ external;
  declare variable $Language as xs:string+ external;
  declare variable $sid as xs:string+ external;
  declare variable $MessageId as xs:string+ external;
  declare variable $uiId as xs:string+ external;
  declare variable $Operation as xs:string+ external;
  declare variable $Service as xs:string+ external;
  declare variable $output as document-node() external;
  element{QName($open,concat('open',':',$Operation))}
  {

  }
  }
  }
</x>
person user3595078    schedule 21.05.2014