For 循环和 mule dataweave 中的 when 条件
For loop and when condition in mule dataweaver
我有一个如下所示的输入 xml 文件,其中我有多个 LineError
段
<LineErrors>
<LineError>
<LineErrorType>CARGO REPORT SAC</LineErrorType>
<LineErrorID>CARGO REPORT SAC</LineErrorID>
<LineErrorDescription>N/A</LineErrorDescription>
</LineError>
<LineError>
<LineErrorType>CONSOLIDATED STATUS</LineErrorType>
<LineErrorID>CONSOLIDATED STATUS</LineErrorID>
<LineErrorDescription>HELD</LineErrorDescription>
</LineError>
</LineErrors>
现在在 dataweaver 中我正在生成另一个 xml 文件,如果有任何包含 LineErrorDescription 字段作为值 "Held" 的 LineError 段,属性将映射到固定值。例如 id = "x" if LineErrors.LineError.LineErrorDescription == "Held"
所以我的问题是如何在 Dataweaver 中进行迭代和比较。如果您有任何线索,请分享。
你看过documentation for DataWeave了吗?我建议以此为起点。文档中的一个示例应该可以帮助您进行操作,如下所示:
使用以下输入:
<users>
<user>
<name>Mariano Achaval</name>
<phone>152235465654</phone>
<street>Laprida 924</street>
</user>
<user>
<name>Martin Alejandro Cousido</name>
<phone>15332255555</phone>
<street>Acassuso 2280</street>
</user>
</users>
使用下面的 DW 脚本 - 注意 secondName
的生成方式:
%dw 1.0
%output application/json
%function words(name) name splitBy " "
---
contacts: payload.users.*user map using (parts = words($.name)){
firstName: parts[0],
(secondName: parts[1]) when (sizeOf parts) > 2,
lastName: parts[-1],
email:((lower $.name) replace " " with ".") ++ "@acme.com",
address: $.street
}
产生以下输出:
{
"contacts": [
{
"firstName": "Mariano",
"lastName": "Achaval",
"email": "mariano.achaval@acme.com.ar",
"address": "Laprida 924"
},
{
"firstName": "Martin",
"secondName": "Alejandro",
"lastName": "Cousido",
"email": "martin.alejandro.cousido@acme.com.ar",
"address": "Acassuso 2280"
}
]
}
我建议在上面的示例后面尝试实现您在原始问题中所解释的内容,如果您 运行 遇到任何问题,请提出一个新问题并举例说明您正在使用的 DW 脚本可以寻求进一步的建议。这样您就可以针对更具体的问题,而不是让 SO 为您完成工作。
希望这对您有所帮助。
你可以同时使用 filter 和 map,试试这个 -
%dw 1.0
%output application/xml
---
payload.LineErrors.*LineError filter ($.LineErrorDescription == 'HELD') map {
id: 'X'
}
我有一个如下所示的输入 xml 文件,其中我有多个 LineError
段 <LineErrors>
<LineError>
<LineErrorType>CARGO REPORT SAC</LineErrorType>
<LineErrorID>CARGO REPORT SAC</LineErrorID>
<LineErrorDescription>N/A</LineErrorDescription>
</LineError>
<LineError>
<LineErrorType>CONSOLIDATED STATUS</LineErrorType>
<LineErrorID>CONSOLIDATED STATUS</LineErrorID>
<LineErrorDescription>HELD</LineErrorDescription>
</LineError>
</LineErrors>
现在在 dataweaver 中我正在生成另一个 xml 文件,如果有任何包含 LineErrorDescription 字段作为值 "Held" 的 LineError 段,属性将映射到固定值。例如 id = "x" if LineErrors.LineError.LineErrorDescription == "Held"
所以我的问题是如何在 Dataweaver 中进行迭代和比较。如果您有任何线索,请分享。
你看过documentation for DataWeave了吗?我建议以此为起点。文档中的一个示例应该可以帮助您进行操作,如下所示:
使用以下输入:
<users>
<user>
<name>Mariano Achaval</name>
<phone>152235465654</phone>
<street>Laprida 924</street>
</user>
<user>
<name>Martin Alejandro Cousido</name>
<phone>15332255555</phone>
<street>Acassuso 2280</street>
</user>
</users>
使用下面的 DW 脚本 - 注意 secondName
的生成方式:
%dw 1.0
%output application/json
%function words(name) name splitBy " "
---
contacts: payload.users.*user map using (parts = words($.name)){
firstName: parts[0],
(secondName: parts[1]) when (sizeOf parts) > 2,
lastName: parts[-1],
email:((lower $.name) replace " " with ".") ++ "@acme.com",
address: $.street
}
产生以下输出:
{
"contacts": [
{
"firstName": "Mariano",
"lastName": "Achaval",
"email": "mariano.achaval@acme.com.ar",
"address": "Laprida 924"
},
{
"firstName": "Martin",
"secondName": "Alejandro",
"lastName": "Cousido",
"email": "martin.alejandro.cousido@acme.com.ar",
"address": "Acassuso 2280"
}
]
}
我建议在上面的示例后面尝试实现您在原始问题中所解释的内容,如果您 运行 遇到任何问题,请提出一个新问题并举例说明您正在使用的 DW 脚本可以寻求进一步的建议。这样您就可以针对更具体的问题,而不是让 SO 为您完成工作。
希望这对您有所帮助。
你可以同时使用 filter 和 map,试试这个 -
%dw 1.0
%output application/xml
---
payload.LineErrors.*LineError filter ($.LineErrorDescription == 'HELD') map {
id: 'X'
}