結果の表示
アプリケーションが XPath 式 (XPathExecutable オブジェクト)、XSLT スタイルシート (XSLTExecutable オブジェクト)、 または XQuery 式 (XQueryExecutable オブジェクト) の XExecutable オブジェクトを作成またはロードした後は、 その XExecutable オブジェクトをいくつかの入力に適用し、その結果を使用した処理を行います。 指定する入力のソース、および、結果を使用して実行する処理によって、 使用する実行メソッドが決まります。
手順
- XPath 結果を表示します。
XPath 式の場合、XPathExecutable インターフェースの 実行メソッドは、所定のコンテキスト項目と動的コンテキスト (存在する場合) によって 式を評価した結果得られるシーケンスを含んだ XSequenceCursor クラスのインスタンスを 返します。
また、XPathExecutable インターフェースには一連の executeToList メソッドもあります。これらのメソッドは、java.util.List<XItemView> インターフェースの インスタンスとしてシーケンスを返します。ここで、XPath 式を評価した結果得られるシーケンス内の 各項目は、XItemView インターフェースのインスタンスとしてリストに表示されます。 そのリストのエントリーは、XPath 式の評価結果として得られるシーケンスのものと 同じ順序で表されます。
以下の例は、ある発注書に記載された各項目のコストを XSequenceCursor どおりに取得する方法を示したものです。XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); XSequenceCursor exprResult = expr.execute(new StreamSource("input.xml"));
以下の例は、 ある発注書に記載された各項目のコストを java.util.List インターフェースのインスタンス内で取得する方法を示したものです。XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); List<XItemView> exprResult = expr.executeToList(new StreamSource("input.xml"));
- XItemView インターフェースを使用します。
XItemView インターフェースのメソッドを使用すると、 あるシーケンス内の各項目にアクセスできます。 XItemView.isAtomic() メソッドを使用すると、項目がアトミック値かまたはノードかを判別できます。 項目がアトミック値の場合は、XItemView インターフェースで getValueType() メソッドを使用できます。 このメソッドは、列挙型 XTypeConstants.Type のインスタンスを返します。 アトミック値が組み込みのアトミック型のインスタンスか、 あるいは組み込みのアトミック型から派生したユーザー定義型のインスタンスである 場合、getValueType() メソッドの結果はその型に対応する列挙値となります。 また、アトミック値がユーザー定義の派生型のインスタンスである場合は、XItemView.getValueTypeName() メソッドを 使用してその値の正確な型を判別するのも便利な方法でしょう。
アトミック値の型が提供されたら、 次に、値の取得に該当するメソッドを使用できます。XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "sum(/purchaseOrder/item/(@unit-price * @quantity))"); XItemView exprResult = expr.execute(new StreamSource(purchaseOrder)); double totalCost = 0.0; // Decide how to get result based on the type of the value switch (exprResult.getValueType()) { case DOUBLE: { totalCost = exprResult.getDoubleValue(); break; } case FLOAT: { totalCost = exprResult.getFloatValue(); break; } case INTEGER: { totalCost = exprResult.getLongValue(); break; } case DECIMAL: { totalCost = exprResult.getDecimalValue().doubleValue(); break; } default: { System.err.println("Unexpected type for result"); } }
XItemView インターフェースは XNodeView インターフェースも 拡張します。したがって、XItemView.isAtomic() メソッドの呼び出し結果が false、つまり、 項目がノードである場合は、XNodeView インターフェースから継承されたメソッドを使用して そのノードの情報にアクセスできます。 XNodeView.getNodeQName() メソッドはノードの名前を返し、XNodeView.getKind() メソッドは、 項目のノードの種類 (XNodeView.DOCUMENT や XNodeView.ELEMENT など) を示す 列挙型 XNodeView.Kind の値を返します。XFactory factory = XFactory.newInstance(); // Prepare an expression to get the first node whose string value matches a given query string XPathExecutable expr = factory.prepareXPath( "(/descendant-or-self::node()/(self::node()|@*)[. = 'search'])[1]"); XItemView exprResult = expr.execute(new StreamSource(inputFile)); // Print the kind of node found and its name, if appropriate switch (exprResult.getKind()) { case ELEMENT: { System.out.print("Element " + exprResult.getNodeQName().toString()); break; } case ATTRIBUTE: { System.out.print("Attribute " + exprResult.getNodeQName().toString()); break; } case COMMENT: { System.out.print("Comment "); break; } case PROCESSING_INSTRUCTION: { System.out.print("PI " + exprResult.getNodeQName().toString()); } }
XTreeCursor インターフェースを使用して、ノードを含むツリーを 探索することもできます。
- XSLT および XQuery 結果を表示します。
XPathExecutable インターフェースから 使用可能なすべての execute および executeToList メソッドは、実際には XExecutable インターフェース から継承されているため、これらのメソッドは XSLTExecutable インターフェースの インスタンスまたは XQueryExecutable インターフェースのインスタンスでも同様に使用できます。 XQueryExecutable インターフェースのインスタンスの場合、メソッドが返すオブジェクトには、 照会の評価から結果として得られるシーケンスが含まれます。XSLTExecutable インターフェースの場合、 シーケンスには、スタイルシート評価の 1 次結果として文書ノードが含まれます (存在する場合)。
XSLTExecutable インターフェースと XQueryExecutable インターフェースは、javax.xml.transform.Result インターフェース のインスタンスを受け入れる各種の実行メソッドも定義します。 アプリケーションが指定する結果オブジェクトには、スタイルシート評価の 1 次 結果 (XSLTExecutable インターフェースの場合)、または照会の評価結果 (XQueryExecutable の場合) が含まれます。
以下の例は、変換の結果として DOM ツリーを生成し、XSLTExecutable.execute メソッドに 引数として渡される DOMResult クラスのインスタンス内にそのツリーを格納するものです。XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); DOMResult res = new DOMResult(); style.execute(new StreamSource("purchase.xml"), res); Node node = res.getNode();
以下に、変換の結果として XSequenceCursor インターフェースのインスタンスを 生成する例を示します。XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); XSequenceCursor xformResult = style.execute(new StreamSource("purchase.xml"));
- XResultResolver および XSLT を使用します。
XSLT 2.0 スタイルシートは、xsl:result-document 命令を 使用して複数の文書を生成できます。変換の 1 次結果は、xsl:result-document 命令に含まれていないスタイルシート、 あるいは、有効値がゼロ長ストリングである href 属性をもった xsl:result-document 命令に含まれる スタイルシートに構成された結果ツリー用に生成されます。 1 次結果は、上記のさまざまな方法を使用してアプリケーションに返されます。
スタイルシートが、有効値がゼロ長ストリングでない href 属性を もった xsl:result-document 命令を評価した場合、デフォルトでは、 出力ストリームにその結果が書き込まれます。 出力ストリームの URI は、動的コンテキスト内での基本出力 URI 設定に対する href 属性の 有効値を解決することによって決定されます。
このデフォルト動作は、変換に使用される XDynamicContext で XResultResolver インターフェースの インスタンスを指定することによりオーバーライドできます。 xsl:result-document 命令が呼び出されると、XResultResolver インターフェースの getResult メソッドが 呼び出されます。getResult メソッドの結果は、xsl:result-document 命令の結果が示される Result インターフェースの インスタンスとなります。 XResultResolver インターフェースを使用することにより、アプリケーションは、 スタイルシート内のすべての xsl:result-document 命令の結果を示す先をケースバイケースで決定します。 アプリケーションが XSLTExecutable インターフェースの実行メソッドの 1 次結果用に Result インターフェースの インスタンスを指定しなかった場合は、XResultResolver の getResult メソッドも 1 次結果用に呼び出されます。
XResultResolver の getResult メソッドでヌル参照が返される場合は、その特定の結果についてのデフォルト動作が復元されます。つまり、2 次結果の場合は結果が出力ストリームに書き込まれ、1 次結果の場合は execute メソッドの結果が XSequenceCursor インターフェースのインスタンスとして返されます。
以下の例は、XResultResolver インターフェースのインスタンスを使用して、 スタイルシートで生成されたすべての結果を、XSequenceCursorResult クラスのインスタンスとして変数 allResults に 取り込んだものです。アプリケーションは、次に、XSequenceCursorResult.getSequenceCursor() メソッドを 使用して、XSequenceCursorResult クラスの各インスタンスに含まれる XSequenceCursor インターフェースのインスタンスを 取り出すことができます。
final ArrayList<XSequenceCursorResult> allResults = new ArrayList<XSequenceCursorResult>(); XFactory factory = XFactory.newInstance(); XDynamicContext context = factory.newDynamicContext(); // Create XResultResolver that saves XSequenceCursorResult // instances in allResults context.setResultResolver(new XResultResolver() { public Result getResult(String href, String base) { XSequenceCursorResult result = new XSequenceCursorResult(); allResults.add(result); return result; } }); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); style.execute(new StreamSource("purchase.xml"), context); // All results, including the primary, are now available from the allResults variable.


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