1

I'm getting struggle in looping the entries in data weaver. Below is the Input and the expected response. Not sure how to make loop(I need to get RecordEntry and each entry with 'IndividualEntry') .

Input xml : Record entry tag in input xml is 3, but I might get many. So need to make a loop as dynamic.

<?xml version="1.0" encoding="UTF-8"?>
<Records>
  <storenumber />
  <calculated>false</calculated>
  <subTotal>12</subTotal>
  <RecordsEntries>
    <RecordEntry>
      <deliverycharge>30.0</deliverycharge>
      <entryNumber>8</entryNumber>
      <Value>true</Value>
    </RecordEntry>
    <RecordEntry>
      <deliverycharge>20.0</deliverycharge>
      <entryNumber>7</entryNumber>
      <Value>false</Value>
    </RecordEntry>
    <RecordEntry>
      <deliverycharge>1.0</deliverycharge>
      <entryNumber>6</entryNumber>
      <Value>false</Value>
    </RecordEntry>
  </RecordsEntries>
</Records>

Expected Response ( I'm expecting the below response)

<?xml version="1.0" encoding="UTF-8"?>
<orders>
  <order>
    <StoreID />
    <Total>false</Total>
    <IndividualEntry>
      <Number>8</Number>
      <DeliverCharge>30.0</DeliverCharge>
    </IndividualEntry>
    <IndividualEntry>
      <Number>7</Number>
      <DeliverCharge>20.0</DeliverCharge>
    </IndividualEntry>
    <IndividualEntry>
      <Number>6</Number>
      <DeliverCharge>1.0</DeliverCharge>
    </IndividualEntry>
  </order>
</orders>

My Data weaver Transformation as below

%dw 1.0
%output application/xml
---
{ 
  orders: {
    order: {
      StoreID:payload.Records.storenumber,
      Total: payload.Records.calculated,
      IndividualEntry: payload.Records.RecordsEntries.*RecordEntry map {
        Number:$.entryNumber,
        DeliverCharge:$.deliverycharge
      }
    }
  }
}

Currently I'm getting response as below ( I don't know how to make each Record entry as a IndividualEntry tag, and also here element tag is added in extra which is not required in my case)

<?xml version="1.0" encoding="UTF-8"?>
<orders>
  <order>
    <StoreID />
    <Total>false</Total>
    <IndividualEntry>
      <element>
        <Number>8</Number>
        <DeliverCharge>30.0</DeliverCharge>
      </element>
      <element>
        <Number>7</Number>
        <DeliverCharge>20.0</DeliverCharge>
      </element>
      <element>
        <Number>6</Number>
        <DeliverCharge>1.0</DeliverCharge>
      </element>
    </IndividualEntry>
  </order>
</orders>

Could any one help me in fix this. Thanks in advance.

Shoki
  • 1,508
  • 8
  • 13
star
  • 1,493
  • 1
  • 28
  • 61

1 Answers1

2

One way to do it:

orders: {
  order: {
      StoreID: payload.Records.storenumber,
      Total: payload.Records.calculated,
      (payload.Records.RecordsEntries.*RecordEntry map {
        IndividualEntry: {
        Number:$.entryNumber,
        DeliverCharge:$.deliverycharge
        }
      })
  }
}

Inside an object when you put an expression between parenthesis that returns an array of key-value pairs it is evaluated and used to fill the object.

See section5.1.3. Dynamic elements in https://developer.mulesoft.com/docs/dataweave

Shoki
  • 1,508
  • 8
  • 13
  • 1
    Please note the key here is to use the map function on an expression that returns the desired collection. In this example, it is payload.Records.RecordsEntries.*RecordEntry . – Ryan Hoegg Sep 01 '15 at 14:31
  • Perfect!! Working fine. Tried multiple things, but haven't tried with Parenthesis. Thank you for the details!! – star Sep 01 '15 at 22:28