我有一个带有两个参数的XML消息,用于调用REST服务端点。但是,如果它们中的任何一个是某个值,我想在通话之前更改它们,例如
<Interface Server="ABC" Server2="DEF"/>
如果其中任何一个具有值“ABC”,则应始终将其替换为“BC”,并且在我对REST服务的调用中,我将在上面的示例中发送param1 =“BC”和param2 =“DEF”。 我正在考虑选择路由器并检查服务器是否为“ABC”然后设置流量变量param1 =“BC”然后我意识到如果那个是“ABC”,我将不得不再次为Server2做同样的事情......这感觉就像..它必须是一种更简单的方法来实现这一目标? 我对吗?我是否可以使用一些聪明的MEL或XPATH3表达式来总是将值替换为“BC”,如果它们中的任何一个是“ABC”?
此致
答案 0 :(得分:2)
您可以尝试以下配置:
<enricher doc:name="Message Enricher">
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/java
%var evaluation = "ABC"
%var substitution = "BC"
%function substitute(serverVal)(
serverVal when serverVal != evaluation otherwise substitution
)
---
payload.Interface.@ mapObject {
($$): substitute($)
}
]]></dw:set-payload>
</dw:transform-message>
<enrich source="#[payload.Server]" target="#[variable:param1]"/>
<enrich source="#[payload.Server2]" target="#[variable:param2]"/>
</enricher>
无论XML源中有多少属性,您只需要相应地添加richher元素。
例如,您有一个新的XML源:<Interface Server="ABC" Server2="DEF" Server3="ABC"/>
然后您只需添加:<enrich source="#[payload.Server3]" target="#[variable:param3]"/>
来设置新变量。
注意: DataWeave 是 EE 功能之一。对于 CE ,您可以将其替换为其他变换器,例如:Groovy。在下面的示例中,有效内容采用String的形式。原始application / xml格式使用byte-array-to-string-transformer
转换为String。
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[def attributeMap = new XmlSlurper().parseText(payload).attributes()
attributeMap.each() {
it.value = it.value == "ABC" ? "BC" : it.value
}
payload = attributeMap]]></scripting:script>
</scripting:component>