You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:27:45