我已经在dataweava中编写了如下代码
%dw 1.0
%input payload application/xml
%output application/xml skipNullOn="everywhere"
---
{((payload.*Order default []) map {
Order:{
Channel:$.@EnterpriseCode,
Code:$.@OrderNo,
Status:$.@Status,
OrderLines: {
(($.OrderLines.*OrderLine default []) map {
OrderLine:{
EntryNumber:"abc",
Status:$.@Status,
(($.OrderStatuses.*OrderStatus default []) map {
ShipDate:$.@StatusDate
})
}})}
}
}
)
}但是,当将输入赋值为
<?xml version="1.0" encoding="UTF-8"?>
<Order EnterpriseCode="111" OrderNo="222" Status="Scheduled">
<OrderLines>
<OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000">
</OrderLine>
</OrderLines>
</Order>这里有什么建议吗?我试过default [],但它不起作用。当给null node赋值时,给出错误。我尝试过作为filter ($ != '')的过滤器
发布于 2015-11-26 00:49:14
XML输入示例
<?xml version="1.0" encoding="UTF-8"?>
<Order EnterpriseCode="111" OrderNo="222" Status="Scheduled">
<OrderLines>
<OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000">
<OrderStatuses>
<OrderStatus StatusDate="statusDate"></OrderStatus>
<OrderStatus StatusDate="statusDate"></OrderStatus>
</OrderStatuses>
</OrderLine>
<OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>
</OrderLines>
</Order>注意:在您的示例中,在OrderLine打开标记和关闭标记之间有空格,您必须修复它:
<OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>数据编织脚本
%input payload application/xml
%output application/xml skipNullOn="everywhere"
---
{
((payload.*Order default []) map {
Order:{
Channel:$.@EnterpriseCode,
Code:$.@OrderNo,
Status:$.@Status,
OrderLines: {
(($.OrderLines.*OrderLine default []) map {
OrderLine:{
EntryNumber:"abc",
Status:$.@Status,
(($.OrderStatuses.*OrderStatus default []) map ((key,pos) -> {
ShipDate:key.@StatusDate
}) when $!='' otherwise {})
}
})
}
}
})
}如果一个值不存在,就不能映射它,所以必须使用“when/否则”来验证元素的存在。
发布于 2015-11-27 08:34:28
试试这个:这个应该能解决你的问题。(除非不是/另有)或(时间/其他),任何组合都可以根据您的要求使用。如果大多数情况下ShipDate存在,则建议使用“除非不是”,否则将“除非”替换为"when“。
%dw 1.0
%input payload application/xml
%output application/xml skipNullOn="everywhere"
---
{
(
(payload.*Order default []) map {
Order: {
Channel:$.@EnterpriseCode,
Code:$.@OrderNo,
Status:$.@Status,
OrderLines: {
(
($.OrderLines.*OrderLine default []) map ({
OrderLine: {
EntryNumber:"abc",
Status:$.@Status,
(
($.OrderStatuses.*OrderStatus) map {
ShipDate:$.@StatusDate
}
)
}
}) unless not $.OrderLines.*OrderLine.OrderStatuses? otherwise {
OrderLine: {
EntryNumber:"abc",
Status:$.@Status
}
}
)
}
}
}
)
}发布于 2018-01-30 20:53:16
尝试以下方法:
payload.yourField == null otherwise payload.yourField
https://stackoverflow.com/questions/33919372
复制相似问题