如何根据WSO2 ESB中的某个元素拆分不同部分的xml

时间:2014-11-13 12:16:43

标签: xml xslt wso2 wso2esb xslt-2.0

我正在尝试将传入的xml邮件拆分为两条消息,并希望在两个不同的端点上发送。就像我的信息是:

 <?xml version="1.0" encoding="utf-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>

<CMMHeader>   
    <MessageTimeStamp>2014-11-13T16:32:58.</MessageTimeStamp>
        <MessageId></MessageId> 
        <ComponentId>GLBooking</ComponentId> 
        <From>test</From> <To>GLBookingQueue</To> 
         <CorrelationId></CorrelationId>
        <ProcessId></ProcessId>
        <EventId></EventId> 
        <Domain>Finance</Domain> 
    </CMMHeader> 

    <tns:GLBooking> 
       <cdm:SubLedger >Payroll </cdm:SubLedger> 
       <cdm:Identifier>10004 </cdm:Identifier>
        <cdm:CreatedBy>test</cdm:CreatedBy>
         <cdm:CompanyCodeTo>3010</cdm:CompanyCodeTo>
          <cdm:PostingDate>20141009</cdm:PostingDate> 
          <cdm:CreationDate>20140901</cdm:CreationDate>
           <cdm:GLBookingLine> 
           <cdm:LineNumber>1</cdm:LineNumber> 
       <cdm:AccountNumber>0000133200</cdm:AccountNumber> 
    <cdm:Description> </cdm:Description> 
    <cdm:TaxCode> </cdm:TaxCode> 
    <cdm:CostCenter> </cdm:CostCenter> 
           <cdm:Currency>EUR</cdm:Currency> 
    <cdm:Amount>00000840213</cdm:Amount> 
    <cdm:DebetCredit>C</cdm:DebetCredit>
            <cdm:BaseAmount>00000000000</cdm:BaseAmount>
    </cdm:GLBookingLine>
             <cdm:GLBookingLine>
              <cdm:LineNumber>2</cdm:LineNumber> 
    <cdm:AccountNumber>0000133205</cdm:AccountNumber>
               <cdm:Description> </cdm:Description> 
    <cdm:TaxCode> </cdm:TaxCode>
                <cdm:CostCenter> </cdm:CostCenter> 
    <cdm:Currency>EUR</cdm:Currency> 
                <cdm:Amount>00000213120</cdm:Amount>
    <cdm:DebetCredit>C</cdm:DebetCredit>
                 <cdm:BaseAmount>00000000000</cdm:BaseAmount> 
    </cdm:GLBookingLine> 
   </tns:GLBooking> 
</GLBookingMessage>
</soapenv:Body>
                 </soapenv:Envelope> 

我想将此消息拆分为两个消息。

<CMMHeader>   
    <MessageTimeStamp>2014-11-13T16:32:58.</MessageTimeStamp>
        <MessageId></MessageId> 
        <ComponentId>GLBookingFileAdapter</ComponentId> 
        <From>test</From> <To>GLBookingQueue</To> 
         <CorrelationId></CorrelationId>
        <ProcessId></ProcessId>
        <EventId></EventId> 
        <Domain>Finance</Domain> 
    </CMMHeader> 

<GLBookingMessage>
 <tns:GLBooking> 
           <cdm:SubLedger >Payroll </cdm:SubLedger> 
           <cdm:Identifier>10004 </cdm:Identifier>
            <cdm:CreatedBy>test</cdm:CreatedBy>
             <cdm:CompanyCodeTo>3010</cdm:CompanyCodeTo>
              <cdm:PostingDate>20141009</cdm:PostingDate> 
              <cdm:CreationDate>20140901</cdm:CreationDate>
               <cdm:GLBookingLine> 
               <cdm:LineNumber>1</cdm:LineNumber> 
           <cdm:AccountNumber>0000133200</cdm:AccountNumber> 
        <cdm:Description> </cdm:Description> 
        <cdm:TaxCode> </cdm:TaxCode> 
        <cdm:CostCenter> </cdm:CostCenter> 
               <cdm:Currency>EUR</cdm:Currency> 
        <cdm:Amount>00000840213</cdm:Amount> 
        <cdm:DebetCredit>C</cdm:DebetCredit>
                <cdm:BaseAmount>00000000000</cdm:BaseAmount>
        </cdm:GLBookingLine>
                 <cdm:GLBookingLine>
                  <cdm:LineNumber>2</cdm:LineNumber> 
        <cdm:AccountNumber>0000133205</cdm:AccountNumber>
                   <cdm:Description> </cdm:Description> 
        <cdm:TaxCode> </cdm:TaxCode>
                    <cdm:CostCenter> </cdm:CostCenter> 
        <cdm:Currency>EUR</cdm:Currency> 
                    <cdm:Amount>00000213120</cdm:Amount>
        <cdm:DebetCredit>C</cdm:DebetCredit>
                     <cdm:BaseAmount>00000000000</cdm:BaseAmount> 
        </cdm:GLBookingLine> 
       </tns:GLBooking> 
    </GLBookingMessage>

请帮帮我。这将是一个很大的好处。

1 个答案:

答案 0 :(得分:1)

在你的inSequence中,克隆消息

在每个目标中,根据需要转换消息并将新消息发送到相应的端点

使用第一个目标中的payloadFactory(仅限CMMHeader的消息)和第二个中的javascript(没有CMMHeader的消息)的示例:

<clone>
    <target>
        <sequence>
            <payloadFactory>
                <format>
                    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                        <soapenv:Body>$1</soapenv:Body>
                    </soapenv:Envelope> 
                </format>
                <args>
                    <arg expression="//CMMHeader"/>
                </args>
            </payloadFactory>
            <log level="full"/>
        </sequence>
    </target>
    <target>
        <sequence>
            <script language="js">
                mc.getEnvelope().getBody().getFirstElement().getFirstElement().detach();
            </script> 
            <log level="full"/>
        </sequence>
    </target>
</clone> 

将'log'替换为'send'mediator

您可以使用XSLT应用转换