如何在 DataWeave 中有条件地填充 xml 标记?

问题描述 投票:0回答:1

我想遍历下面的标签:

      <pur:Schedule>
        <pur:StatusNumber>1</pur:StatusNumber>
        <pur:RequestDate>2023-02-22</pur:RequestDate>
        <pur:Action>CHANGE</pur:Action>
      </pur:Schedule>

我想在Mode等于CHANGE时填充上面的标签,否则如果Mode等于CANCEL跳过整个标签。

输入负载

{"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 mulesoft mule4
1个回答
0
投票

您可以将条件添加到生成该密钥的脚本部分。请注意,脚本的输出不能用作脚本的一部分。避免这种表达问题的方式。而是考虑输入如何产生输出。我重用了生成元素

Mode
.

的条件
        (
          pur#Schedule: {
            pur#StatusNumber: "1",
            pur#RequestDate: $.Date,
            pur#Action: "CHANGE"
          }
        ) if ($.Quantity != 0)
© www.soinside.com 2019 - 2024. All rights reserved.