这是我的xml,首先需要检查'RecordsEntries'不为'null',然后RecordEntry不应为null,然后是映射代码

<?xml version="1.0" encoding="UTF-8"?>
<Records>
  <storenumber />
  <calculated>false</calculated>
  <subTotal>12</subTotal>
 <RecordsEntries>
   <RecordEntry>
     <deliverycharge>30.0</deliverycharge>
     <entryNumber>8</entryNumber>
     <Value>true</Value>
  </RecordEntry>
  <RecordEntry>
    <deliverycharge>20.0</deliverycharge>
    <entryNumber>7</entryNumber>
    <Value>false</Value>
  </RecordEntry>
</RecordsEntries>
 <RecordsEntries>
    <RecordEntry>
      <deliverycharge>30.0</deliverycharge>
      <entryNumber>8</entryNumber>
      <Value>false</Value>
    </RecordEntry>
 </RecordsEntries>
</Records>

尝试过多种情况,也使用了when条件检查,但缺少括号或格式正确的地方
    orders: {
    order: {
  StoreID: payload.Records.storenumber,
  Total: payload.Records.calculated,
 (( payload.Records.RecordsEntries.*RecordEntry ) map {
    IndividualEntry: {
    Number:$.entryNumber,
    DeliverCharge:$.deliverycharge
    }
  } when ( payload.Records.RecordsEntries != null and payload.Records.RecordsEntries.*RecordEntry !=null))}
}

出现错误,例如缺少)。通过在第一个循环中直接检查null条件进行了其他尝试,得到了诸如“无法将数组强制转换为 bool 值”之类的错误。请提出建议。谢谢。

最佳答案

你可以做

%dw 1.0
%output application/xml
---
orders: {
  order: {
  StoreID: payload.Records.storenumber,
  Total: payload.calculated,
 ((payload.Records.*RecordsEntries.*RecordEntry default []) map {
      IndividualEntry: {
        Number:$.entryNumber,
        DeliverCharge:$.deliverycharge
      }
    })
  }
}

DataWeave是“空安全”的,用于查询类似于payload.Records.*RecordsEntries.*RecordEntry中的值,但是尝试使用null进行操作(例如null map {})时将引发错误。
default运算符将其左侧的值(如果是null)替换为右侧的值。

另外,您还缺少*。每当您需要所有重复的元素都匹配时,就需要在xml中使用它。

10-04 11:13
查看更多