使用DataWeave将XML元素值映射到元素名称



我需要一个符合以下规则的DataWeave 2.0脚本
规则:

  • PtID Z001的BID将映射到Bpay标签。
  • PtID Z002的BID将映射到Payment Tag.

输入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
})
}

最新更新