Search code examples
dataweavemulesoft

Transform one XML format to other XML format in Mulesoft


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>

Solution

  • 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
            })
        }
    }