When evaluating XPath expressions inside a route, you can use XPath variables to
access the contents of the current exchange, as well as O/S environment variables
and Java system properties. The syntax to access a variable value is
$
or
VarName
$
,
if the variable is accessed through an XML namespace.Prefix
:VarName
For example, you can access the In message's body as
$in:body
and the In message's header value as
$in:
. O/S environment
variables can be accessed as HeaderName
$env:
and
Java system properties can be accessed as
EnvVar
$system:
.SysVar
In the following example, the first route extracts the value of the
/person/city
element and inserts it into the city
header. The second route filters exchanges using the XPath expression,
$in:city = 'London'
, where the $in:city
variable is
replaced by the value of the city
header.
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");
In addition to the standard XPath functions, the XPath language defines additional functions. These additional functions (which are listed in Table 19.4) can be used to access the underlying exchange, to evaluate a simple expression or to look up a property in the Fuse Mediation Router property placeholder component.
For example, the following example uses the in:header()
function and
the in:body()
function to access a head and the body from the
underlying exchange:
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");
Notice the similarity between theses functions and the corresponding
in:
or
HeaderName
in:body
variables. The functions have a slightly different syntax
however: in:header(
instead of
'HeaderName'
)in:
; and
HeaderName
in:body()
instead of in:body
.
You can also use variables in expressions that are evaluated using the
XPathBuilder
class. In this case, you cannot use variables such as
$in:body
or $in:
,
because there is no exchange object to evaluate against. But you
can use variables that are defined inline using the
HeaderName
variable(
fluent builder method.Name
,
Value
)
For example, the following XPathBuilder construction evaluates the
$test
variable, which is defined to have the value,
London
:
String var = XPathBuilder.xpath("$test") .variable("test", "London") .evaluate(getContext(), "<name>foo</name>");
Note that variables defined in this way are automatically entered into the global
namespace (for example, the variable, $test
, uses no prefix).