我有这样的输入xml
<parent>
<child type="reference">
<grandChild name="aaa" action="None">
<Attribute name="xxx">1</Attribute>
<grandChild name="bbb" action="None">
<Attribute name="xxx">1</Attribute>
</grandChild>
<grandChild name="ccc" action="None">
<Attribute name="xxx">1</Attribute>
</grandChild>
</grandChild>
<grandChild name="ddd" action="None">
<Attribute name="xxx">1</Attribute>
</grandChild>
</child>
</parent>
,并且我想仅使用parent-> child-> grandChild标签将其拆分为多个xml,以上示例总共应转换为4个xml(因为有4个grandChild)。像这样-
<parent>
<child type="reference">
<grandChild name="aaa" action="None">
<Attribute name="xxx">1</Attribute>
</grandChild>
</child>
</parent>
<parent>
<child type="reference">
<grandChild name="bbb" action="None">
<Attribute name="xxx">1</Attribute>
</grandChild>
</child>
</parent>
<parent>
<child type="reference">
<grandChild name="ccc" action="None">
<Attribute name="xxx">1</Attribute>
</grandChild>
</child>
</parent>
<parent>
<child type="reference">
<grandChild name="ddd" action="None">
<Attribute name="xxx">1</Attribute>
</grandChild>
</child>
</parent>
有人可以指导我吗?我一直在寻找Mule 3上可用的其他集合拆分器替代方案。
答案 0 :(得分:1)
这将创建这些xml的数组,因此,如果将此表达式放入foreach表达式中,它将满足您的需要。
%dw 2.0
import dw::core::Objects
fun collectChilds(node) = do {
var children = node.&grandChild default {}
---
(children mapObject ((item, key) -> {
parent: {
child @("type": "reference") : {
(key) : item.&Attribute
}
}
}) pluck ((value, key, index) -> {(key) : value})
) ++ (Objects::valueSet(children) flatMap ((item, index) -> collectChilds(item)))
}
---
collectChilds(payload.parent.child)