Mule Dataweave 重复 XML 个元素到单独命名的 XML 个元素

Mule Dataweave Repeating XML Elements to Individually Named XML Elements

输入XML

<Address>
    <Street>Street Line 1</Street>
    <Street>Street Line 2</Street>
    <Street>Street Line 3</Street>
    <City>City</City>
    <Postcode>0000</Postcode>
</Address>

输出XML需要

<DeliveryAddress>
    <DA1>Street Line 1</DA1>
    <DA2>Street Line 2</DA2>
    <DA3>Street Line 3</DA3>
    <City>City</City>
    <Postcode>0000</Postcode>
</DeliveryAddress>

如何使用 Dataweave 将每个街道元素放入出站中的特定 DA 元素XML?

我尝试使用 * 通配符 (Address.*Street) 但是这会将 Street 元素作为子元素:

<DeliveryAddress>
    <DA1>
        <Street>Street 1</Street>
        <Street>Street 2</Street>
        <Street>Street 3</Street>
    </DA1>
    <City>City</City>
    <Postcode>0000</Postcode>
</DeliveryAddress>

求助^_^

* 通配符用于引用重复的元素,尤其是在 XML 格式中。从这一点开始我们可以依次解决这个问题:

  1. 从这个表达式开始payload.Address.*Street我们将得到一个街道列表。
  2. 但是在当前的DataWeave表达式中直接使用会报错。因此将该表达式包裹在方括号内:(payload.Address.*Street) 使其成为对象而不是数组。
  3. 现在我们只需要将Street标签重命名为对应的DA(n)。因此我们可以利用 map 运算符来迭代每条记录,并使用 bracketsquote marks, () or '' or "" 包含输出的键:

("DA" ++ $$ + 1)"DA$($$ + 1)" 都同样返回相同的结果:DA1、DA2、DA3、...

因此,该字段的完整表达式应为:(payload.Address.*Street map { ("DA" ++ $$ + 1): $ })

基于我刚刚在下面复制的 Suthony 输入,您可以找到 dwl 脚本

%dw 1.0

%输出application/xml

送货地址:{

(payload.Address.*Street map { 
    ("DA" ++ $$ + 1): $
}),
    city:payload.Address.City,
    PostCode:payload.Address.Postcode

}

干杯!

{
    DeliveryAddress: {
        (payload.Address.*Street map {
            ("DA" ++ $$ +1): $
        }),
        City: payload.Address.City,
        Postcode: payload.Address.Postcode
    }
}
  1. 使用地图遍历 Street 元素
  2. ("DA" ++ $$+1)打印DA1、DA2等。