Вот выражение DW, которое сгенерирует одно и то же XML:
%dw 2.0
output application/xml
ns ns0 http://www.sifassociation.org/datamodel/au/3.4
var rId = payload[0].RefId
var lId = payload[0].LocalId
var sId = payload[0].StateProvinceId
---
ns0#SchoolInfo @(RefId: rId): {
ns0#LocalId: lId,
ns0#StateProvinceId: sId,
ns0#SchoolEmailList: payload reduce (e,acc={}) -> acc ++ {
ns0#Email @(Type: e.Type): e.Email
}
}
Я предполагаю, что RefId
, LocalId
и StateProvinceId
всегда будут одинаковыми для запроса.
Объяснение reduce
: reduce
объясняется здесь в деталях вместе с его теоретическими основами. Вот также 1014 * страница документации MuleSoft . Эта последняя страница довольно неплохо объясняет reduce
Теперь, по моим собственным словам, reduce
принимает в качестве входных данных (1) массив и (2) лямбда-функцию.
Массив содержит элементы, которые reduce
будет перебирать аналогично функции map
. Сходство между функциями map
и reduce
заканчивается здесь:).
Функция лямбда ожидает два аргумента: (1) текущий элемент, который вы перебираете из массива, и (2) аккумулятор. Аккумулятор можно инициализировать в значение (я установил его для объекта {}
в вашем случае использования, потому что XML не любит массивы). Результат лямбда-функции для этой FIRST-итерации устанавливается в качестве аккумулятора для следующей итерации и т. Д.
Результатом reduce
является аккумулятор после выполнения итерации по массиву.
Таким образом, если бы я должен был отследить этот параметр c reduce
, он будет выглядеть примерно так, и я упросту обозначение этих значений:
/*
* 1st iteration: (e=steven@gmail.com, acc={}) -> acc + {Email: steven@gmail.com}
* 2nd iteration: (e=test@gmail.com, acc={Email: steven@gmail.com} -> acc + {Email: test@gmail.com}
* result: acc = {Email: steven@gmail.com, Email: test@gmail.com}
*/