问题描述
我从数据库中检索了如下对象的json数组
[
{ "Projectid":"A1234","ProjectLvl":1,"desc":"A1234-desc"},{ "Projectid":"A1234.1","ProjectLvl":2,"desc":"A1234.1-desc"},{ "Projectid":"A1234.1.1","ProjectLvl":3,"desc":"A1234.1.1-desc"},{ "Projectid":"A1234.1.1.1","ProjectLvl":4,"desc":"A1234.1.1.1-desc"},{ "Projectid":"A1234.2","desc":"A1234.2-desc"},{ "Projectid":"A1234.2.1","desc":"A1234.2.1-desc"}
]
我必须创建以下xml。您可以帮助在we子转换组件中使用dataweave函数吗?
<projects>
<project level="1">
<desc>A1234-desc</desc>
<project level="2">
<desc>A1234.1-desc</desc>
<project level="3">
<desc>A1234.1.1-desc</desc>
<project level="4">
<desc>A1234.1.1.1-desc</desc>
</project>
</project>
</project>
<project level="2">
<desc>A1234.2-desc
</desc>
<project level="3">
<desc>A1234.2.1-desc
</desc>
</project>
</project>
</project>
</projects>
解决方法
一个不错的问题,我的解决方案尝试在树上使用reduce和递归更新来使用id中的路径更新节点
%dw 2.0
output application/xml
fun updateTree(tree,path: Array<Number>,treeNode: {}) = do {
if(sizeOf(path) == 1)
tree ++ treeNode
else
tree mapObject ((value,key,index) ->
if(index + 1 == path[0] and key ~= "project")
{
(key): updateTree(value,path[1 to -1],treeNode)
}
else
{
(key):value
}
)
}
---
projects: {
(
payload reduce ((project,accumulator = {}) -> do {
var path = project.Projectid[sizeOf("A1234") to -1] default "" splitBy "." filter !isEmpty($) map $ as Number
---
updateTree(accumulator,path,{
project @(level: project.ProjectLvl): {
desc: project.desc
}
})
}
)
)
}
,
尝试使用path
变量
project.Projectid[sizeOf("A123") to 1] default "" splitBy "." filter !isEmpty($) map $ as Number