%dw 2.0
import * from dw::core::Strings
output application/xml
fun applyToKeys(element, func) =
if (element is Object)
element mapObject (value, key) -> {
(func(key)) : applyToKeys( value, func)
}
else element
---
applyToKeys(payload, (key) -> lower(key))
Pass Functions as Arguments
This DataWeave example defines a base function in the header that receives two arguments: a function and an element to apply it on. The base function the applies the received function onto the keys of the received element and also to every one of its child elements recursively. In this case, the function sent sets all keys to lower case. Before you begin, note that 2.x versions of DataWeave are used by Mule 4 apps. For DataWeave in Mule 3 apps, refer to DataWeave version 1.2 examples. For other DataWeave versions, you can use the version selector in the DataWeave table of contents.
The example uses the following:
-
A custom function that is applied recursively, ie: it calls itself for each child in the element it receives originally.
-
mapObject
to sort through each child of the element. -
lower
from the Strings library to make every Key in the input lower case. -
is
to check if the passed element is of typeObject
(and therefore has children). -
if
andelse
to only have the function call itself when a condition is met, and to otherwise end the recursive loop for that branch.
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
</CATALOG>
<?xml version='1.0' encoding='US-ASCII'?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
</catalog>