0
votes

i have a requirement two combine two similar xml responses into one xml payload. Here, i stored one xml into flowVar and other is in payload. Im trying with XSLT but not getting it. Below is the sample xml responses.

Response1 :

<root>
 <token>hhd</token>
 <type>xyz</type>
 <statement>
   <id>1</id>
   <name>sri</name>
 </statement>
 <statement>
   <id>2</id>
   <name>jay</name>
 </statement>
<root>

Response2:

<root>
 <token>hhd</token>
 <type>xyz</type>
 <statement>
   <id>3</id>
   <name>paul</name>
 </statement>
 <statement>
   <id>4</id>
   <name>nick</name>
 </statement>
<root>

In above two similar responses, i have to add 2nd response statement tags to 1st xml response.Here all tags are same in both xmls except statement tag. Im using XSLT and unable to do it.

Output:

<root>
 <token>hhd</token>
 <type>xyz</type>
 <statement>
   <id>1</id>
   <name>sri</name>
 </statement>
 <statement>
   <id>2</id>
   <name>jay</name>
 </statement>
 <statement>
   <id>3</id>
   <name>paul</name>
 </statement>
 <statement>
   <id>4</id>
   <name>nick</name>
 </statement>
<root>

Is there any alternative way to do it like with dataweave. Thanks.

4

4 Answers

0
votes

You can do it many ways... for example, if you use Dataweave, you can solve using the following dataweave scripts:-

Here, I have stored one of the xml payload say xml2 in a flow variable data, and other xml from payload.

<set-variable variableName="data" value="&lt;root&gt;&lt;token&gt;hhd&lt;/token&gt;&lt;type&gt;xyz&lt;/type&gt;&lt;statement&gt;&lt;id&gt;3&lt;/id&gt;&lt;name&gt;paul&lt;/name&gt;&lt;/statement&gt;&lt;statement&gt;&lt;id&gt;4&lt;/id&gt;&lt;name&gt;nick&lt;/name&gt;&lt;/statement&gt;&lt;/root&gt;" doc:name="Variable" mimeType="application/xml"/>

  <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[
             %dw 1.0
             %output application/xml 
              ---
            root : {
            token:payload.root.token,
            type:payload.root.type,
            (payload.root.*statement map {
             statement : {
               ($)

                }  
             }),

          (flowVars.data.root.*statement map {
            statement : {
            ($)

          }  
         })

 }]]></dw:set-payload>
        </dw:transform-message>

I am getting following combined output xml:-

<?xml version='1.0' encoding='windows-1252'?>
<root>
    <token>hhd</token>
    <type>xyz</type>
    <statement>
        <id>1</id>
        <name>sri</name>
    </statement>
    <statement>
        <id>2</id>
        <name>jay</name>
    </statement>
    <statement>
        <id>3</id>
        <name>paul</name>
    </statement>
    <statement>
        <id>4</id>
        <name>nick</name>
    </statement>
</root>

Note Just make sure, if you are posting one of your payload xml from postman, make sure you define Content-Type as application/xml and also set the mime-type of the flow variable to application/xmlwhere you store another xml
Also make sure both your response1 xml and response2 xml are valid, as I can find you haven't ended the root tag

0
votes

Easiest way is like adding objects like

<dw:transform-message doc:name="Transform Message" >
            <dw:input-payload mimeType="application/xml"/>
            <dw:set-payload><![CDATA[%dw 1.0
%output application/xml
---
root : payload.root ++ flowVars.data.root.*statement ]]></dw:set-payload>
        </dw:transform-message>

Hope this helps

0
votes

To combine payload use, "flatten payload" in Transform Message. It will combine both and display as a single payload.

0
votes

I had similar issue and I tried to transform both xml source (one in payload and one in variable) to Java objects(array list). Then I have put set payload with payload ++ vars.xmlmessage I have used dataweave/transfrom message beside this to tranform into XML as below:

%dw 2.0
output application/xml
---
{
  responsedata: {
    message: payload
  }
}