Как преобразовать сообщение, используя 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, моя Конфигурация прокси - Прокси
<?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 . Пространство имен для каждого запроса меняется, поэтому нам нужно объявить как динамический. Некоторое тело, пожалуйста, помогите мне в этом
Заранее спасибо.
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>