70.3. 例
from("queue:foo") .filter().xquery("//foo") .to("queue:bar")
クエリー内で関数を使用することもできます。その場合、明示的な型変換が必要です。明示的な型変換を行わないと、org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR
が発生します。関数で必要とされる出力タイプを渡す必要があります。たとえば、concat 関数は 文字列
を返します。これは以下のように行われます。
from("direct:start") .recipientList().xquery("concat('mock:foo.', /person/@city)", String.class);
そして XML DSL では:
<route> <from uri="direct:start"/> <recipientList> <xquery type="java.lang.String">concat('mock:foo.', /person/@city</xquery> </recipientList> </route>
70.3.1. 名前空間の使用
使用する名前空間の標準セットがあり、それらを多くの XQuery 式で共有する場合は、次のように Java DSL を使用するときに org.apache.camel.support.builder.Namespaces
を使用できます。
Namespaces ns = new Namespaces("c", "http://acme.com/cheese"); from("direct:start") .filter().xquery("/c:person[@name='James']", ns) .to("mock:result");
2 番目のパラメーターとして渡される ns
変数を使用して、名前空間が xquery
にどのように提供されるかに注意してください。
各名前空間はキー=値のペアで、この場合に接頭辞がキーです。XQuery 式では、名前空間はその接頭辞によって使用されます。たとえば、次のようになります。
/c:person[@name='James']
名前空間ビルダーは、次のように複数の名前空間の追加をサポートしています。
Namespaces ns = new Namespaces("c", "http://acme.com/cheese") .add("w", "http://acme.com/wine") .add("b", "http://acme.com/beer");
XML DSL で名前空間を使用する場合は、XML ルートタグ (または camelContext
、routes
、route
タグの 1 つ) で名前空間を設定するため、異なります。
以下の XML の例では、Spring XML を使用します。この名前空間は、ルートタグ beans
の xmlns:foo="http://example.com/person"
の行で宣言されています。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foo="http://example.com/person" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="activemq:MyQueue"/> <filter> <xquery>/foo:person[@name='James']</xquery> <to uri="mqseries:SomeOtherQueue"/> </filter> </route> </camelContext> </beans>
この名前空間は接頭辞として foo
を使用するため、<xquery>
式は /foo:
を使用してこの名前空間を使用します。