XPath での外部変数の使用
外部変数を用いた XPath 式を使用する場合は、XDynamicContext インスタンスを使用して各変数ごとに 値を指定 (またはバインド) します。また、オプションで XStaticContext インスタンスを使用して各変数の型を宣言します。
手順
- 外部変数を用いた XPath 式を作成する場合は、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 型) 変数の値が単一ノードか、あるいはアトミック値またはノードのシーケンスである 場合に使用します 以下に、静的コンテキスト内で宣言された 2 つの変数と、 宣言されていない 1 つの変数を使用した XPath 式を作成する方法の例を示します。// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context from the factory XStaticContext staticContext = factory.newStaticContext(); // Define QNames for the names of the variables to be declared final QName taxRate = new QName("taxRate"); final QName partNumbers = new QName("partNumbers"); // Declare a variable called "taxRate" as an xs:float staticContext.declareVariable(taxRate, XTypeConstants.FLOAT_QNAME); // Obtain an XSequenceTypeFactory instance from the factory XSequenceTypeFactory typeFactory = factory.getSequenceTypeFactory(); // Define a sequence type for a sequence of xs:integer values XSequenceType integerSequence = typeFactory.atomic(XTypeConstants.INTEGER_QNAME, XSequenceType.OccurrenceIndicator.ZERO_OR_MORE); // Declare a variable called "partNumbers" as a sequence of xs:integer values staticContext.declareVariable(partNumbers, integerSequence); // Create an XPath expression that uses the declared variables, as well as another variable "discount" // that the processor will assume has type item()* String expression = "sum(for $partNumber in $partNumbers return /inventory/part[@num=$partNumber]/@price) * (1 - $discount) * (1 + $taxRate)"; // Prepare the XPath expression XPathExecutable xpath = factory.prepareXPath(expression, staticContext);
- 外部変数を使用した XPath 式を実行するには、XDynamicContext インスタンスを使用して
各変数ごとに値を指定 (またはバインド) します。
XPath 式の実行時に使用される変数に値を指定しない場合は、エラーが表示されます。
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 番目の例で作成された XPath 式を実行したものです。// Create a new dynamic context from the factory XDynamicContext dynamicContext = factory.newDynamicContext(); // Bind an atomic value for the "taxRate" and "discount" variables dynamicContext.bind(taxRate, 0.13f); dynamicContext.bind(new QName("discount"), 0.40); // Bind a sequence of atomic values for the "partNumbers" variable dynamicContext.bindSequence(partNumbers, new int[] {2, 1, 2, 3, 2}); // Create an XML input document String xml = "<inventory>" + "<part num='1' price='9.99'/>" + "<part num='2' price='4.47'/>" + "<part num='3' price='12.99'/>" + "</inventory>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the expression XSequenceCursor result = xpath.execute(source, dynamicContext);


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