如何在DataWeave中条件式填充XML标签?
需求说明
需要根据Mode值控制<pur:Schedule>标签的生成逻辑:
- 当Mode值为
CHANGE时,生成如下标签:
<pur:Schedule> <pur:StatusNumber>1</pur:StatusNumber> <pur:RequestDate>2023-02-22</pur:RequestDate> <pur:Action>CHANGE</pur:Action> </pur:Schedule>
- 当Mode值为
CANCEL时,跳过整个<pur:Schedule>标签。
输入Payload
{ "Order": { "Reason": "apple", "Line": [ { "Quantity": 30, "Date": "2023-02-22", "Pricing": { "Amount": "11.34" }, "Details": { "Number": "247" } }, { "Quantity": 12, "Date": "2023-02-25", "Pricing": { "Amount": "11.34" }, "Details": { "Number": "247" } }, { "Quantity": 0, "Date": "2023-02-21", "Pricing": { "Amount": "11.34" }, "Details": { "Number": "247" } } ] } }
已使用的DataWeave脚本
%dw 2.0 output text/xml writeDeclaration=false ns typ http://xmlns.oracle.com/apps/prc/po/editDocument/order/types/ ns pur http://xmlns.oracle.com/apps/prc/po/editDocument/order/ --- {typ#Product: { typ#Entry: { pur#OrderId: payload.Order.Line.Details.Number[0], pur#OrderDescription: payload.Order.Reason, pur#EntryLine: payload.Order.Line map { pur#productNumber: $.Details.Line_Number, pur#Qty: $.Ordered_Quantity, pur#unit: $.Pricing.Amount , pur#status: if($.Quantity != 0) "Changed" else "", pur#Mode: if($.Quantity == 0) "CANCEL" else "CHANGE", pur#Reason: if($.Quantity == 0) "Cancelled" else "", (pur#Schedule: { pur#StatusNumber: "1", pur#RequestDate: $.Date, pur#Action: "CHANGE" }) } } }}
期望输出
<typ:Product xmlns:typ="http://xmlns.oracle.com/apps/prc/po/editDocument/order/types/"> <typ:Entry> <pur:OrderId xmlns:pur="http://xmlns.oracle.com/apps/prc/po/editDocument/order/">247</pur:OrderId> <pur:OrderDescription xmlns:pur="http://xmlns.oracle.com/apps/prc/po/editDocument/order/">apple</pur:OrderDescription> <pur:EntryLine xmlns:pur="http://xmlns.oracle.com/apps/prc/po/editDocument/order/"> <pur:productNumber/> <pur:Qty/> <pur:unit>11.34</pur:unit> <pur:status>Changed</pur:status> <pur:Mode>CHANGE</pur:Mode> <pur:Reason/> <pur:Schedule> <pur:StatusNumber>1</pur:StatusNumber> <pur:RequestDate>2023-02-22</pur:RequestDate> <pur:Action>CHANGE</pur:Action> </pur:Schedule> </pur:EntryLine> <pur:EntryLine xmlns:pur="http://xmlns.oracle.com/apps/prc/po/editDocument/order/"> <pur:productNumber/> <pur:Qty/> <pur:unit>11.34</pur:unit> <pur:status>Changed</pur:status> <pur:Mode>CHANGE</pur:Mode> <pur:Reason/> <pur:Schedule> <pur:StatusNumber>1</pur:StatusNumber> <pur:RequestDate>2023-02-25</pur:RequestDate> <pur:Action>CHANGE</pur:Action> </pur:Schedule> </pur:EntryLine> <pur:EntryLine xmlns:pur="http://xmlns.oracle.com/apps/prc/po/editDocument/order/"> <pur:productNumber/> <pur:Qty/> <pur:unit>11.34</pur:unit> <pur:status/> <pur:Mode>CANCEL</pur:Mode> <pur:Reason>Cancelled</pur:Reason> </pur:EntryLine> </typ:Entry> </typ:Product>
修正后的DataWeave脚本
只需给<pur:Schedule>标签添加条件判断,就能实现需求:
%dw 2.0 output text/xml writeDeclaration=false ns typ http://xmlns.oracle.com/apps/prc/po/editDocument/order/types/ ns pur http://xmlns.oracle.com/apps/prc/po/editDocument/order/ --- {typ#Product: { typ#Entry: { pur#OrderId: payload.Order.Line.Details.Number[0], pur#OrderDescription: payload.Order.Reason, pur#EntryLine: payload.Order.Line map (line) -> { pur#productNumber: line.Details.Line_Number, pur#Qty: line.Ordered_Quantity, pur#unit: line.Pricing.Amount , pur#status: if(line.Quantity != 0) "Changed" else "", pur#Mode: if(line.Quantity == 0) "CANCEL" else "CHANGE", pur#Reason: if(line.Quantity == 0) "Cancelled" else "", // 仅当Mode为CHANGE时生成Schedule标签 (if(line.Quantity != 0) pur#Schedule: { pur#StatusNumber: "1", pur#RequestDate: line.Date, pur#Action: "CHANGE" } else {}) } } }}
逻辑说明
在DataWeave中,用括号包裹的条件表达式会根据判断结果决定是否生成对应节点:
- 当
line.Quantity != 0(即Mode为CHANGE)时,生成<pur:Schedule>节点 - 当
line.Quantity == 0(即Mode为CANCEL)时,返回空对象,不会生成该节点
内容的提问来源于stack exchange,提问作者james11
相关产品推荐
相关产品推荐

