Dataweave 2.0 - 创建树结构的 xml

cib*_*iba 2 dataweave

我有如下从数据库中检索的对象的 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","ProjectLvl":2,"desc":"A1234.2-desc"}, 
    { "Projectid":"A1234.2.1","ProjectLvl":3,"desc":"A1234.2.1-desc"}
]
Run Code Online (Sandbox Code Playgroud)

我必须创建以下 xml。您能否帮助使用 dataweave 函数以在 mule 变换组件中使用。

<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> 
Run Code Online (Sandbox Code Playgroud)

mac*_*val 6

嗨,好问题我的解决方案尝试使用树上的减少和递归更新来更新具有来自 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    
                    }
                })
            }
        )
    )
}
Run Code Online (Sandbox Code Playgroud)