How to remove the DTOSteps node which contains id using mule 4

Viewed 63

I am trying to remove DTOSteps node if it contains an ID attribute.

Input XML:

<?xml version="1.0" encoding="UTF-8"?>
<DTOApplication id="Application-1660258480-1493174910" ApplicationNumber="AP-00006354">
    <DTOLine id="Line-101746978-972142087" StatusCd="Active" >
        <DTOCoverage id="Coverage-1713637162-341585712" CoverageCd="MINP" >
            <DTOSteps>
                <DTOStep Order="1" Name="Premium"/>
                <DTOStep Order="2" Name="Term Factor">
                    <DTOSteps>
                            <DTOStep Order="1" Name="Minimum Premium" />
                            <DTOStep Order="2" Name="Rated Premium" />
                    </DTOSteps>
                </DTOStep>
            </DTOSteps>
        </DTOCoverage>
        <DTOCoverage id="Coverage-763105832-915106268" CoverageCd="TRIAL">
            <DTOSteps id="Steps-Coverage-763105832-915106268">
                <DTOStep id="Step-Coverage-763105832-915106268-Premium" Name="Premium" />
                <DTOStep id="Step-Coverage-763105832-915106268-TermFactor" Name="Term Factor"/>
            </DTOSteps>
        </DTOCoverage>
    </DTOLine>
    <DTOCoverage id="Coverage-763105832-915106268" CoverageCd="EBRK" >
        <DTOSteps id="Steps-Coverage-863105832-915106268">
            <DTOStep id="Step-Coverage-863105832-915106268-Premium" Name="Base Rate"/>
            <DTOStep id="Step-Coverage-863105832-915106268-TermFactor" Name="Term Factor"/>
        </DTOSteps>
    </DTOCoverage>
</DTOApplication>

I tried the dataweave 2.0 but it removes all the DTOSteps node from input xml.

My dataweave code:

%dw 2.0
output application/xml

fun FNtransformCoverage(x, index)=
    x match {
      case is Object -> x mapObject 
        if ($$ as String == "DTOCoverage" )
            { 
                DTOCoverage @(( $$.@ )): $ - "DTOSteps"

            }
        else 
            (($$): FNtransformCoverage($, index+1)) 
      else -> $
    }
    
---
FNtransformCoverage(payload,1)

Expected output: https://github.com/Manikandan99/Map_request/blob/main/Transformed_output.xml

Any ideas please on how to remove DTOSteps which contains id using dataweave 2.0?

1 Answers

You script has the right high level approach. It just needed to use filterObject() to remove the elements. Then mapObject is used only to recursively apply to the nested elements.

%dw 2.0
output application/xml
fun FNtransformCoverage(x)=
    x match {
        case is Object -> 
            x 
                filterObject ((value, key, index) ->
                    key as String != "DTOSteps" or not (key.@id?))
                mapObject ($$):FNtransformCoverage($)
        else -> $
    }
---
FNtransformCoverage(payload)

Output:

<?xml version='1.0' encoding='UTF-8'?>
<DTOApplication id="Application-1660258480-1493174910" ApplicationNumber="AP-00006354">
  <DTOLine id="Line-101746978-972142087" StatusCd="Active">
    <DTOCoverage id="Coverage-1713637162-341585712" CoverageCd="MINP">
      <DTOSteps>
        <DTOStep Order="1" Name="Premium"/>
        <DTOStep Order="2" Name="Term Factor">
          <DTOSteps>
            <DTOStep Order="1" Name="Minimum Premium"/>
            <DTOStep Order="2" Name="Rated Premium"/>
          </DTOSteps>
        </DTOStep>
      </DTOSteps>
    </DTOCoverage>
    <DTOCoverage id="Coverage-763105832-915106268" CoverageCd="TRIAL"/>
  </DTOLine>
  <DTOCoverage id="Coverage-763105832-915106268" CoverageCd="EBRK"/>
</DTOApplication>

Note: there is a duplicated line in your expected output.

Related