I want to convert one XML format to another XML format with the help of Dataweave, What would be the valid Dataweave 2.0 expression to convert
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<notifications xmlns="http://soap.sforce.com/2005/09/outbound">
<OrganizationId>00D1x0000008cRREAY</OrganizationId>
<ActionId>04k1x000000CbbhAAC</ActionId>
<SessionId/>
<EnterpriseUrl>https://hastens--ecom.my.salesforce.com/services/Soap/c/48.0/00D1x0000008cRR</EnterpriseUrl>
<PartnerUrl>https://hastens--ecom.my.salesforce.com/services/Soap/u/48.0/00D1x0000008cRR</PartnerUrl>
<Notification>
<Id>04l1x000002dPXfAAM</Id>
<sObject xmlns:sf="urn:sobject.enterprise.soap.sforce.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="sf:PBSI__PBSI_Sales_Order__c">
<sf:order-status>CANCELLED</sf:order-status>
<sf:order-no>00000905</sf:order-no>
<sf:zenkraftOrderShippingStatus>shipped</sf:zenkraftOrderShippingStatus>
<sf:zenkraftOrderCarrier>UPS</sf:zenkraftOrderCarrier>
<sf:zenkraftOrderTrackingNumber>37999</sf:zenkraftOrderTrackingNumber>
</sObject>
</Notification>
</notifications>
</soapenv:Body>
</soapenv:Envelope>
to
<?xml version="1.0" encoding="UTF-8"?>
<orders xmlns="http://www.demandware.com/xml/impex/order/2006-10-31">
<order order-no="00000905">
<status>
<order-status>CANCELLED</order-status> -> don't insert it in case it is not cancelled
</status>
<custom-attributes>
<custom-attribute attribute-id="zenkraftOrderShippingStatus">SHIPPED</custom-attribute>
<custom-attribute attribute-id="zenkraftOrderTrackingNumber">37999</custom-attribute>
<custom-attribute attribute-id="zenkraftOrderCarrier">UPS</custom-attribute>
</custom-attributes>
</order>
</orders>
You can do it with something like:
%dw 2.0
output application/xml
ns ns0 http://www.demandware.com/xml/impex/order/2006-10-31
var obj = payload.Envelope.Body.notifications.Notification.sObject
var customAttrs = obj -- ["order-status", "order-no"]
---
{
orders @(xmlns: ns0): {
order @("order-no": obj."order-no"): {
(status: obj."order-status") if obj."order-status" == "CANCELLED"
},
"custom-attributes": customAttrs mapObject ((value, key) -> {
"custom-attribute" @(id: "$key"): value
})
}
}