Star
Star

Reputation: 1503

How to handle For each condition in Data weaver: Mule

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.

Upvotes: 1

Views: 584

Answers (1)

Shoki
Shoki

Reputation: 1538

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

Upvotes: 2

Related Questions