我需要一个符合以下规则的DataWeave 2.0脚本
规则:
- PtID Z001的BID将映射到Bpay标签。
等
输入XML文件:
<File>
<Block>BlockID</Block>
<Identification actionCode="04">
<PtID>Z001</PtID>
<BID>BPayID</BID>
<BText>Partner ID for Z001 Section</BText>
</Identification>
<Identification actionCode="04">
<PtID>Z002</PtID>
<BID>PaymentID</BID>
<BText>Partner ID for Z002 Section</BText>
</Identification>
<Identification actionCode="04">
<PtID>Z003</PtID>
<BID>CreditID</BID>
<BText>Partner ID for Z003 Section</BText>
</Identification>
<Identification actionCode="04">
<PtID>Z004</PtID>
<BID>DebitID</BID>
<BText>Partner ID for Z004 Section</BText>
</Identification>
<Identification actionCode="04">
<PtID>Z005</PtID>
<BID>TaxID</BID>
<BText>Partner ID for Z005 Section</BText>
</Identification>
</File>
期望的XML输出:
<Result>
<Block>BlockID</Block>
<Bpay>BPayID</Bpay>
<Payment>PaymentID</Payment>
<Credit>CreditID</Credit>
<Debit>DebitID</Debit>
<Tax>TaxID</Tax>
</Result>
是否试图在这些行上尝试一些东西?
脚本
%dw 2.0
output application/xml
---
Result: payload.*File map {
Block: payload.File.Block,
($.*Identification map {
(if($.PtID == "Z001") "BPay" else if ($.PtID == "Z002") "Payment" else if ($.PtID == "Z003") "Credit" else if ($.PtID == "Z004") "Debit" else "Tax" ): $.BID
}
)
}
<?xml version='1.0' encoding='UTF-8'?>
<Result>
<Block>BlockID</Block>
<BPay>BPayID</BPay>
<Payment>PaymentID</Payment>
<Credit>CreditID</Credit>
<Debit>DebitID</Debit>
<Tax>TaxID</Tax>
</Result>
与其他答案类似,使用不同的方法将列映射与代码分开(如果需要,这允许映射完全外部化)
%dw 2.0
output application/XML
var columnMapping = {
Z001: "Bpay",
Z002: "Payment",
Z003: "Credit",
Z004: "Debit",
Z005: "Tax"
}
---
Result: {
Block: payload.File.Block,
(payload.File.*Identification map (id) -> {
(columnMapping[id.PtID] default "NULL"): id.BID
} filterObject ($$ as String) != "NULL")
}
我修改了@SalimKhan已经有效的答案,使用模式匹配(match…case)而不是if…其他就看个人喜好了
%dw 2.0
output application/xml
---
Result: payload.*File map {
Block: payload.File.Block,
($.*Identification map {
($.PtID match {
case is "Z001" -> "BPay"
case is "Z002" -> "Payment"
case is "Z003" -> "Credit"
case is "Z004" -> "Debit"
case is "Z005" -> "Tax"
else -> dw::Runtime::fail("Unexpected PtID: $($)")
}): $.BID
})
}