XQuery での外部変数の使用
外部変数を用いた XQuery 式を使用する場合は、XDynamicContext インスタンスを使用して各変数ごとに 値を指定 (またはバインド) します。また、オプションで XStaticContext インスタンスを使用して各変数の型を宣言します。
手順
- 外部変数を用いた XQuery 式を作成する場合は、XStaticContext インスタンスを使用して
変数の型を宣言します。
XStaticContext で宣言された変数は、メイン・モジュールに対してのみ可視になります。 外部変数をライブラリー・モジュールに可視にするには、そのライブラリー・モジュールの Prolog 内で外部変数宣言を使用してそれを宣言する必要があります。
XStaticContext での変数の宣言はオプションです。 変数が宣言されていない場合、プロセッサーはその変数の型が item()* であると見なします。 つまり、その変数の値は、任意の型の項目で構成された任意の長さのシーケンスと することができます。 変数の型を宣言することにより、プロセッサーは、作成時にいくつかの使用法エラーを静的に検出できます。
XStaticContext インターフェースには 2 つの declareVariable メソッドが あります。各メソッドには 2 つのパラメーターがあり、1 つは名前、もう 1 つは変数の型を示します。 名前は常に QName オブジェクトとして指定されますが、型には、QName または XSequenceType を指定できます。表 1. XStaticContext declareVariable メソッド. 以下の表に、declareVariable メソッドの各書式を使用する時機を示します。
メソッド・シグニチャー 目的 declareVariable(QName 名前、QName 型) 変数の値が単一のアトミック値である場合に使用します QName は、組み込み型、あるいは XStaticContext インスタンスの作成に 使用される XFactory インスタンスに登録済みのスキーマ内で宣言された グローバル型を参照します。QName がアトミック以外の型を参照する場合、 プロセッサーは変数を element(*, ns:type) 型を保持するものとして扱います。 ここで、ns:type は所定の QName です。XTypeConstants インターフェースには、 組み込みの型ごとに QName オブジェクトを指定できる便利な定数があります。
declareVariable(QName 名前、XSequenceType 型) 変数の値が単一ノードか、あるいはアトミック値またはノードのシーケンスである 場合に使用します XQuery では、XQuery 式の Prolog に変数を宣言することも可能です。 以下の XQuery 式では、2 つの変数を使用します。1 つは Prolog に宣言されたもの、もう 1 つは宣言されていないものです。
XQuery 式自体に宣言されていない変数は、プロセッサーに型情報を提供するために、 オプションで XStaticContext インスタンスを使用して宣言できます。declare namespace xs = "http://www.w3.org/2001/XMLSchema"; declare variable $searchTerms as xs:string+ external; <table> <tr><td>Title</td><td>Author</td></tr> { for $book in /library/book let $value := $book/@*[local-name()=$searchField] where exists(for $term in $searchTerms return if (contains($value, $term)) then true() else ()) return <tr> <td>{ string($book/@title) }</td> <td>{ string($book/@author) }</td> </tr> } </table>
以下の例は、XQuery 式自体に宣言されていない変数の型を指定して、上記の XQuery 式を作成する方法を示したものです。この式が xquerySource ソース・オブジェクトを使用してアクセスできることを前提としています。// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context from the factory XStaticContext staticContext = factory.newStaticContext(); // Define a QName for the name of the variable to be declared final QName searchField = new QName("searchField"); // Declare a variable called "searchField" as an xs:string staticContext.declareVariable(searchField, XTypeConstants.STRING_QNAME); // Prepare the XQuery expression XQueryExecutable xquery = factory.prepareXQuery(xquerySource, staticContext);
- 外部変数を使用した XQuery 式を実行するには、XDynamicContext インスタンスを使用して
各変数ごとに値を指定 (またはバインド) します。
外部変数のバインディングは、メイン・モジュールならびに、その外部変数の Prolog で外部変数宣言をしているすべてのライブラリー・モジュールで使用可能になります。
XQuery 式の実行時に使用される変数に値を指定しない場合は、 エラーが表示されます。
XDynamicContext には多くの bind、bindItem、および bindSequence メソッドがあります。各メソッドには 2 つのパラメーターがあります。1 番目の パラメーターはそのパラメーターの名前に対応する QName オブジェクトであり、2 番目は値です。表 2. XDynamicContext の bind、bindItem、および bindSequence メソッド. 以下の表に、 XDynamicContext の bind、bindItem、および bindSequence メソッドの各書式を使用する時機を示します。
メソッド 目的 バインド (bind) 単一のアトミック値をバインドするときに使用します 組み込み型から Java™ 型への標準マッピングに使用される Java 型のそれぞれに、 このメソッドの書式が 1 つずつあります。 このメソッドには、2 つの追加書式があります。1 つはノードを取り、もう 1 つはソースを取ります。 これらの書式は、それぞれ、DOM ツリーからノードをバインドするため、および新規ソースを構文解析して文書ノードを生成するために使用されます。
bindItem 単一の項目を XItemView オブジェクトとしてバインドするときに使用します XItemView オブジェクトは、別の式の実行結果から取得するか、 あるいは XItemFactory インスタンスを使用して構成することができます。
bindSequence 1 項目未満または 1 項目超のシーケンスをバインドするときに使用します 組み込み型から Java 型への標準マッピングに使用される Java 型のそれぞれに、 このメソッドの書式が 1 つずつあり、それぞれが所定の型の値の配列を受け入れます。
このメソッドには、XSequenceCursor を取る追加の書式があります。XSequenceCursor は、 別の式の実行結果にするか、あるいは XItemFactory インスタンスを使用して構成することができます。
以下の例は、まず最初に、各変数ごとに使用される値を バインドしてから、1 番目の例で作成された XQuery 式を実行したものです。// Create a new dynamic context from the factory XDynamicContext dynamicContext = factory.newDynamicContext(); // Bind an atomic value for the "searchField" variable dynamicContext.bind(searchField, "title"); // Bind a sequence of atomic values for the "searchTerms" variable dynamicContext.bindSequence(new QName("searchTerms"), new String[] {"Lost", "Gables"}); // Create an XML input document String xml = "<library>" + "<book title='Lost in the Barrens' author='Farley Mowat'/>" + "<book title='Anne of Green Gables' author='L. M. Montgomery'/>" + "</library>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the expression XSequenceCursor result = xquery.execute(source, dynamicContext);


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_vars_xquery
ファイル名:txml_vars_xquery.html