2

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?

aled
  • 21,330
  • 3
  • 27
  • 34
codey_08
  • 249
  • 1
  • 11
  • The script is not so big as not to be added to the question. Even the output might not trigger the limit. – aled Feb 17 '22 at 12:40

1 Answers1

3

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.

aled
  • 21,330
  • 3
  • 27
  • 34