Как обрабатывать каждое условие в Data Weaver: Mule

Мне трудно зацикливать записи в Data Weaver. Ниже приведены входные данные и ожидаемый ответ. Не знаю, как сделать цикл (мне нужно получить RecordEntry и каждую запись с «IndividualEntry»).

Входной xml: тег записи во входном xml равен 3, но я могу получить много. Так что нужно сделать петлю максимально динамичной.

<?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>

Ожидаемый ответ (я ожидаю ответа ниже)

<?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, как показано ниже

%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
      }
    }
  }
}

В настоящее время я получаю ответ, как показано ниже (я не знаю, как сделать каждую запись записи как тег IndividualEntry, а также здесь добавляется дополнительный тег element, который в моем случае не требуется)

<?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>

Может ли кто-нибудь помочь мне исправить это. Заранее спасибо.


person star    schedule 01.09.2015    source источник


Ответы (1)


Один из способов сделать это:

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

Внутри object, когда вы помещаете в скобки выражение, которое возвращает array of key-value pairs, оно оценивается и используется для заполнения object.

См. Section5.1.3. Dynamic elements в https://developer.mulesoft.com/docs/dataweave.

person Shoki    schedule 01.09.2015
comment
Обратите внимание, что ключевым моментом здесь является использование функции карты в выражении, которое возвращает желаемую коллекцию. В этом примере это payload.Records.RecordsEntries. * RecordEntry. - person Ryan Hoegg; 01.09.2015
comment
Идеально!! Работает нормально. Пробовал несколько вещей, но не пробовал с круглыми скобками. Спасибо за подробности !! - person star; 02.09.2015