32.8. 変数と関数の使用

ルート内の変数の評価

ルート内で XPath 式を評価する場合、XPath 変数を使用して、現在のエクスチェンジの内容、O/S 環境変数、および Java システムプロパティーにアクセスすることができます。XML 名前空間を介して変数にアクセスする場合、変数の値にアクセスするための構文は $VarName または $Prefix:VarName です。

たとえば、In メッセージのボディーには $in:bodyIn メッセージのヘッダー値には $in:HeaderName としてアクセスできます。O/S 環境変数は $env:EnvVar として、Java システムプロパティーは $system:SysVar としてアクセスできます。

以下の例では、最初のルートは /person/city 要素の値を抽出し、city ヘッダーに挿入します。2 番目のルートは、XPath 式 ($in:city = 'London') を使用してエクスチェンジをフィルタリングします。$in:city 変数は 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");

in:HeaderName または in:body 変数で、これらの関数と対応する機能との類似性に注目してください。ただし、これらの関数は構文が若干異なり、in:HeaderName の代わりに in:header('HeaderName')in:body の代わりに in:body() となっています。

XPathBuilder での変数の評価

XPathBuilder クラスを使用して評価される式で変数を使用することもできます。この場合、評価対象となる Exchange オブジェクトがないため、$in:body$in:HeaderName などの変数を使用することはできません。しかし、variable(Name, Value) Fluent Builder メソッドを使用してインラインで定義された変数を使うことができます

たとえば、以下の XPathBuilder 設定は、$test 変数を評価します。変数の値は、London となるように定義されています。

String var = XPathBuilder.xpath("$test")
               .variable("test", "London")
               .evaluate(getContext(), "<name>foo</name>");

この方法で定義された変数は、自動的にグローバル名前空間に入力されることに注意してください (たとえば、変数 $test は接頭辞を使用しません)。