32.8. 変数と関数の使用
ルート内の変数の評価
ルート内で XPath 式を評価する場合、XPath 変数を使用して、現在のエクスチェンジの内容、O/S 環境変数、および Java システムプロパティーにアクセスすることができます。XML 名前空間を介して変数にアクセスする場合、変数の値にアクセスするための構文は $VarName
または $Prefix:VarName
です。
たとえば、In メッセージのボディーには $in:body
、In メッセージのヘッダー値には $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
は接頭辞を使用しません)。