以下是将生成相同 XML 的 DW 表达式:
%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
, and StateProvinceId
每个查询总是相同的。
的解释reduce
:
reduce
已解释here详细介绍了其理论基础。这里还有reduce的 MuleSoft 文档页面。最后一页很好地解释了reduce
现在用我自己的话来说,reduce
将 (1) 一个数组和 (2) 一个 lambda 函数作为输入。
数组包含元素reduce
将以类似的方式迭代map
函数确实如此。之间的相似之处map
and reduce
功能到此结束:)。
lambda 函数需要两个参数:(1) 从数组中迭代的当前元素和 (2) 累加器。累加器可以初始化为一个值(我将其设置为一个对象{}
在您的用例中,因为 XML 不喜欢数组)。第一次迭代的 lambda 函数的结果被设置为下一次迭代的累加器,依此类推。
的结果reduce
是数组迭代完成后的累加器。
因此,如果我要追踪这个特定的reduce
它看起来像这样,我简化了这些值的表示:
/*
* 1st iteration: ([email protected], acc={}) -> acc + {Email: [email protected]}
* 2nd iteration: ([email protected], acc={Email: [email protected]} -> acc + {Email: [email protected]}
* result: acc = {Email: [email protected], Email: [email protected]}
*/