So I created a XQuery script compatible with Oracle Service Bus that does the following:
- Takes a node
- Takes a list of node names (including namespaces) that we want to convert
- A translation table as before
=> We return the provided node with the nodes in the node name list translated into the new values.
declare namespace tmp = "http://www.tempuri.co.nz/xquery/"; declare function tmp:convertString($inputString as xs:string, $translationSet as element()*) as xs:string { if (count($translationSet) = 0) then (: base case :) $inputString else (: recursion :) let $fromValue := data($translationSet[1]/translate_from) let $toValue := data($translationSet[1]/translate_to) let $updatedStr := fn:replace($inputString,$fromValue,$toValue) return tmp:convertString($updatedStr,remove($translationSet,1)) }; declare function tmp:replaceAll($element as element(), $updateNodes as xs:string*, $translationSet as element()*) as element() { element { fn:node-name($element) } { $element/@*, for $child in $element/node() return if ($child instance of element()) then tmp:replaceAll($child, $updateNodes,$translationSet) else if ($child instance of text() and count(index-of($updateNodes,fn:name($element)))) then tmp:convertString($child,$translationSet) else $child } }; declare variable $element as element() external; declare variable $updateNodes as xs:string* external; declare variable $translationSet as element() external; tmp:replaceAll($element, $updateNodes, $translationSet//translation)
Then in Oracle Service Bus I created a request/response pipeline at the very start with a replace node in each stage. The XPath is simply '.' in the variable body, with the XQuery created above. The external variables above are as follows:
translationSet:
A BB C DD
updateNodes:
"firstname","lastname"
element:
$body
This will take the $body node, and find all nodes called "firstname" and "lastname", replacing all "A"'s and "C"'s with "BB" and "DD" respectively. Obviously strange characters will be more useful ;).
How many stages do you have in the message flow?
ReplyDeletei.e., nbr of replace nodes