Search code examples
muledataweavemulesoftmule4

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


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?


Solution

  • 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.