A status in XML needs to change before it gets forwarded. If RESPONSE.OUTBOUND.STATUS is equal to "ERR", it needs to say "FAILURE" instead. Other messages that STATUS may contain must remain as is.
Sample XML before processing:
<?xml version="1.0" encoding="UTF-8"?>
<RESPONSE>
<ID>9497585</ID>
<DATE>2020-10-01</DATE>
<TIME>18:38:04</TIME>
<OUTBOUND>
<CODE>921</CODE>
<STATUS>ERR</STATUS>
<DESC>Manufacturing flaw</DESC>
</OUTBOUND>
<ORIGIN>
<METHOD>POST</METHOD>
<STATUS>200 OK</STATUS>
<CLIENTID>29834</CLIENTID>
<DIAG>330</DIAG>
<NOTES>XRAY revealed air pockets.</NOTES>
</ORIGIN>
</RESPONSE>
DataWeave:
%dw 2.0
output application/xml
---
payload
- "RESPONSE" ++
{ "RESPONSE" :
(payload.RESPONSE - "OUTBOUND") ++
{ "OUTBOUND" :
(payload.RESPONSE.OUTBOUND - "STATUS") ++
{"STATUS" :
if (payload.RESPONSE.OUTBOUND.STATUS == "ERR")
"FAILURE"
else
payload.RESPONSE.OUTBOUND.STATUS
}
}
}
This is the output:
<?xml version='1.0' encoding='UTF-8'?>
<RESPONSE>
<ID>9497585</ID>
<DATE>2020-10-01</DATE>
<TIME>18:38:04</TIME>
<ORIGIN>
<METHOD>POST</METHOD>
<STATUS>OK</STATUS>
<CLIENTID>29834</CLIENTID>
<DIAG>330</DIAG>
<NOTES>XRAY revealed air pockets.</NOTES>
</ORIGIN>
<OUTBOUND>
<CODE>921</CODE>
<DESC>Manufacturing flaw</DESC>
<STATUS>FAILURE</STATUS>
</OUTBOUND>
</RESPONSE>
This works in a way, but to change a single value, it seems unnecessarily complex. It's like using a sledgehammer because I couldn't find a scalpel. Is there a simpler way to get to the node and change it?
Also, XML is node-order dependent. By removing and then reinserting the sub-node, I end up changing the sequence of the nodes ("OUTBOUND" now comes after "ORIGIN"). This will probably create grief down the road.