32.8. 使用变量和函数
评估路由中的变量
当评估路由中的 XPath 表达式时,您可以使用 XPath 变量访问当前交换的内容,以及 O/S 环境变量和 Java 系统属性。如果通过 XML 命名空间访问变量,则访问变量值 的语法为
: VarName。
$VarName
或 $Prefix
例如,您可以将 In 消息的正文访问为 $in:body
,In message 的标题值为 $in:HeaderName
。O/S 环境变量可作为 $env:EnvVar
和 Java 系统属性进行访问,可作为 $system:SysVar
进行访问。
在以下示例中,第一个路由提取 /person/city
元素的值,并将其插入到 城市
标头中。第二个路由过滤器使用 XPath 表达式 $in:city = 'London'
进行交换,其中 $in:city
变量被 城市
标头的值替代。
from("file:src/data?noop=true") .setHeader("city").xpath("/person/city/text()") .to("direct:tie"); from("direct:tie") .filter().xpath("$in:city = 'London'").to("file:target/messages/uk");
评估路由中的功能
除了标准 XPath 功能外,XPath 语言还定义了其他功能。这些附加功能(在 表 32.4 “XPath 自定义功能”中列出的)可用于访问底层交换,用于评估简单表达式或在 Apache Camel 属性占位符组件中查找属性。
例如,以下示例使用 in:header()
函数和 in:body()
函数来访问底层交换中的头条和正文:
from("direct:start").choice() .when().xpath("in:header('foo') = 'bar'").to("mock:x") .when().xpath("in:body() = '<two/>'").to("mock:y") .otherwise().to("mock:z");
注意这些功能和对应在 HeaderName或
变量之间的相似性。功能有稍有不同的语法: in:
body在:header('HeaderName')
中,而不是 in:HeaderName
; 和 in:body()
而不是 in:body
()。
评估 XPathBuilder 中的变量
您还可以使用使用 XPathBuilder
类评估的表达式中的变量。在这种情况下,您不能使用 $in:body
或 $in:HeaderName
等变量,因为没有要评估的交换对象。但是,您可以使用 内嵌 定义的变量(名称、值)
fluent 构建器方法。
例如,以下 XPathBuilder 构造将评估 $test
变量,该变量被定义为 伦敦
的值:
String var = XPathBuilder.xpath("$test") .variable("test", "London") .evaluate(getContext(), "<name>foo</name>");
请注意,以这种方式定义的变量将自动输入到全局命名空间中(例如,变量 $test
不使用前缀)。