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