如何在 mule 3 中声明局部变量

How to declare a local variable in mule3

我正在 Mule 3 中进行数据转换。我正在更新现有代码,其中在 DataWeave 1.0 中声明了很多变量

我想在声明的变量中添加一个名为“type__c”的字段。

我的输入载荷如下

{
  "billofPlaning": {
    "billcollection": {
      "itemDetail": [
        {
          "comm": [
            {
              "commodity": {
                "itemSequence": 1,
                "equipmentPrefix": "ABCD",
                "equipmentNumber": "1234"
              }
            },
             {
              "commodity": {
                "itemSequence": 2,
                "equipmentPrefix": "DEFG",
                "equipmentNumber": "5678"
              }
            }
          ]
        }
      ]
    },
       "equip": [
      {
        "equipment": {
          "prefix": "ABCD",
          "number": "1234",
          "type": 2345
        }
      },
       {
        "equipment": {
          "prefix": "HIJ",
          "number": "7890",
           "type": 234567
        }
      }
    ]
  }
}

我现有的 DataWeave 1.0 脚本是这样的:

%dw 1.0
%output application/java
%var inputData=payload
%var payBill= inputData.billofPlaning.billcollection.itemDetail default [] map (billcode,indexOfbillcode) -> {
    billcode: {
            "field1": "",
            "type__c": ""
        }
---
paybill

我想在上面的 DataWeave 1.0 代码中为字段“type__c”重用下面的 DataWeave 2.0 代码。

%dw 2.0
output application/json
var test= ((payload.billofPlaning.equip) filter (($.equipment.prefix == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentPrefix[0])
and ($.equipment.number == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentNumber[0])))
---
"type__c": test.equipment."type"[0]

我们能否使用 DataWeave 1.0 以某种更好的方式来做到这一点(基本上是使用任何局部变量或我们在 DataWeave 1.0 中声明的 payBill 变量中的某些内容)?

不清楚您的转换逻辑是什么以及预期结果是什么。如果您只想重用 test 变量,DataWeave 1 和 DataWeave 2 之间那个特定变量的唯一区别是前者的变量声明使用 % 字符。我将它添加到脚本中并删除了无用的 inputData 变量。我还修复了缺少结束大括号的脚本。

%dw 1.0
%output application/java
%var test= ((payload.billofPlaning.equip) filter (($.equipment.prefix == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentPrefix[0])
and ($.equipment.number == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentNumber[0])))        

%var payBill=(payload.billofPlaning.billcollection.itemDetail default []) 
        map (billcode,indexOfbillcode) -> {
          billcode: {
            "field1": "",
            "type__c":  test
          }
        }
---
payBill

输出:

[{billcode={field1=, type__c=[{equipment={prefix=ABCD, number=1234, type=2345}}]}}]

如果你想定义一个'local'变量你可以用using语法声明scoped variables。我看不出这在这个特定脚本中有何意义。通常它用于简化对嵌套项的访问,此脚本不使用它。

示例:

%dw 1.0
%output application/java
%var payBill=(payload.billofPlaning.billcollection.itemDetail default []) 
        map (billcode,indexOfbillcode) -> 
          using ( test= ((payload.billofPlaning.equip) filter (($.equipment.prefix == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentPrefix[0])
and ($.equipment.number == payload.billofPlaning.billcollection.itemDetail.comm[0].commodity.equipmentNumber[0])))    )        

          {
            billcode: {
              "field1": "",
              "type__c":  test
            }
          }
---
payBill

我不会称之为改进。

DataWeave 2.0 中的等价物是 do 命令,它具有改进的功能和更好的语法。