I have done coding in dataweava as
%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
})
}})}
}
}
)
}
But its giving error when assigning input as
<?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>
Any suggestions here? I have tried default []
but its not working. When assigning null node
its giving error. I have tried filter as filter ($ != '')
XML input example:
<?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>
Note: In your example there are spaces between OrderLine
open tag and close tag, you have to fix it:
<OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>
Dataweave script:
%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 {})
}
})
}
}
})
}
You can't map a value if it doesn't exist, so you have to use "when/otherwise" to verify the existence of the elements.