Отображение в Dataweave

Мне нужно преобразовать XML в JSON в dataweave. XML запроса:

<Root>
<AccRoot>
    <FinRoot>
        <FinData>
            <SomeValue>Test</SomeValue>
        </FinData>
        <PassRoot>
            <PassData>
                <PassData2>
                    <Leg>001</Leg>
                    <Data>Sample1</Data>
                    <Data2>Sample2</Data2>
                    <Data3>Sample3</Data3>
                </PassData2>
            </PassData>
        </PassRoot>
            <PassData>
                <PassData2>
                    <Leg>002</Leg>
                    <Data>Sample21</Data>
                    <Data2>Sample22</Data2>
                    <Data3>Sample23</Data3>
                </PassData2>
            </PassData>
        <PassRoot>
            <PassData>
                <PassData2>
                    <Leg>003</Leg>
                    <Data>Sample31</Data>
                    <Data2>Sample32</Data2>
                    <Data3>Sample33</Data3>
                </PassData2>
            </PassData>
        </PassRoot>
        <PassRoot>
            <PassData>
                <PassData2>
                    <Leg>004</Leg>
                    <Data>Sample41</Data>
                    <Data2>Sample42</Data2>
                    <Data3>Sample43</Data3>
                </PassData2>
            </PassData>
        </PassRoot>
    </FinEntity>
</PrimeEntity>
</Root>

Результирующий JSON должен быть

Result: Sample1:Sample2:Sample3.Sample21:Sample22:Sample23.Sample31:Sample32:Sample33.Sample41:Sample42:Sample43

то есть я должен объединить все записи в PassData2 с помощью ':', а затем я должен проверить, присутствует ли 'Leg' со значением '+1', если да, то я должен сделать то же самое для этих элементов и присоединиться к ним с участием '.'


person Nishith Coomar    schedule 26.07.2018    source источник
comment
Цените помощь !!   -  person Nishith Coomar    schedule 27.07.2018
comment
Выходной файл JSON имеет неправильный формат. Пожалуйста, исправьте это, чтобы понять проблему.   -  person aled    schedule 15.10.2018


Ответы (1)


     %dw 1.0
 %output application/json
 ---
 {
     Result: payload.AccRoot.FinRoot..PassData2 
         orderBy ($.Leg as :number) 
         reduce ((val, acc = []) -> 
             (acc ++ [val]) when acc == [] or acc[-1].Leg as :number + 1 == val.Leg as :number 
             otherwise acc
         )
         map ([$.Data, $.Data2, $.Data3] joinBy ':')
         joinBy '.'
 }
  1. Выбирает все узлы PassData2

  2. Заказывает их по ногам (если они неупорядочены)

  3. Выполняет сокращение, чтобы гарантировать, что единственными элементами в массиве являются элементы с последовательными значениями для Leg.

  4. Сопоставляет каждый элемент слева конкатенации его узлов Data *, используя: в качестве разделителя

  5. Присоединяется к окончательному массиву с помощью.

person Nishith Coomar    schedule 07.02.2019