Affichage des résultats
Lorsque votre application a fini de préparer ou de charger l'objet XExecutable d'une expression XPath (objet XPathExecutable), d'une expression XQuery (objet XQueryExecutable) ou d'une feuille de style XSLT (objet XSLTExecutable), vous devez appliquer cet objet XExecutable à une entrée puis traiter le résultat. Les méthodes d'exécution que vous pouvez utiliser pour ce faire varient selon la source de l'entrée fournie et le type de traitement que vous souhaitez appliquer au résultat.
Procédure
- Afficher les résultats pour XPath.
Dans le cas d'une expression XPath, les méthodes d'exécution de l'interface XPathExecutable renvoient une instance de la classe XSequenceCursor qui contient la séquence des résultats issus de l'évaluation de l'expression avec l'élément contextuel fourni, et le contexte dynamique le cas échéant.
L'interface XPathExecutable possède également une liste de méthodes executeToList. Ces méthodes renvoient la séquence sous la forme d'une instance de l'interface java.util.List<XItemView> dans laquelle chaque élément résultant de l'évaluation de l'expression XPath est représenté dans la liste sous la forme d'une instance de l'interface XItemView. Les entrées de cette liste apparaissent dans le même ordre que dans la séquence résultant de l'évaluation de l'expression XPath.
L'exemple de code suivant montre comment extraire le coût de chaque article figurant dans un bon de commande sous la forme d'un objet XSequenceCursor.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); XSequenceCursor exprResult = expr.execute(new StreamSource("input.xml"));
L'exemple de code suivant montre comment extraire le coût de chaque article figurant dans un bon de commande dans une instance de l'interface 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"));
- Utiliser l'interface XItemView.
Vous pouvez accéder à chaque élément d'une séquence à l'aide des méthodes de l'interface XItemView. Vous pouvez utiliser la méthode XItemView.isAtomic() pour déterminer si l'élément est une valeur atomique ou un noeud. Si l'élément est une valeur atomique, vous pouvez utiliser la méthode getValueType() de l'interface XItemView. Cette méthode renvoie une instance du type énumératif XTypeConstants.Type. Si la valeur atomique est une instance d'un type atomique intégré ou d'un type défini par l'utilisateur dérivé d'un type atomique intégré, le résultat de la méthode getValueType() est la valeur énumérative correspondant à ce type. Si la valeur atomique est d'un type dérivé défini par l'utilisateur, vous pourrez utiliser la méthode XItemView.getValueTypeName() pour déterminer son type précis.
Une fois connu le type d'une valeur atomique, vous pouvez alors utiliser la méthode appropriée pour obtenir sa valeur.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"); } }
L'interface XItemView est également une extension de l'interface XNodeView. Si un appel de la méthode XItemView.isAtomic() renvoie la valeur "false", autrement dit si l'élément est un noeud, vous pouvez utiliser les méthodes héritées de l'interface XNodeView pour obtenir des informations sur le noeud. La méthode XNodeView.getNodeQName() renvoie le nom du noeud tandis que la méthode XNodeView.getKind() renvoie une valeur du type énumératif XNodeView.Kind qui indique le type de noeud de l'élément : XNodeView.DOCUMENT, XNodeView.ELEMENT, ou autre.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()); } }
Vous pouvez également explorer l'arborescence qui contient un noeud avec l'interface XTreeCursor.
- Afficher les résultats avec XSLT et XQuery
Toutes les méthodes execute et executeToList disponibles dans l'interface XPathExecutable sont en fait héritées de l'interface XExecutable. Elles sont donc également disponibles dans les instances de l'interface XSLTExecutable et de l'interface XQueryExecutable. Dans le cas d'une instance de l'interface XQueryExecutable, l'objet renvoyé par la méthode contient la séquence résultant de l'évaluation de la requête. Dans le cas de l'interface XSLTExecutable, la séquence contient le noeud de document du résultat primaire de l'évaluation de la feuille de style, le cas échéant.
Les interfaces XSLTExecutable et XQueryExecutable définissent également des méthodes d'exécution qui acceptent une instance de l'interface javax.xml.transform.Result. L'objet de résultat que l'application fournit contient le résultat primaire de l'évaluation de la feuille de style, dans le cas de l'interface XSLTExecutable, ou le résultat de l'évaluation de la requête, dans le cas de l'interface XQueryExecutable.
L'exemple suivant montre comment générer une arborescence DOM comme résultat d'une transformation, et comment enregistrer cette arborescence dans l'instance de la classe DOMResult communiquée comme argument à la méthode XSLTExecutable.execute.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();
L'exemple suivant montre comment générer une instance de l'interface XSequenceCursor comme résultat d'une transformation.XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); XSequenceCursor xformResult = style.execute(new StreamSource("purchase.xml"));
- Utiliser XResultResolver et XSLT.
Une feuille de style XSLT 2.0 peut produire plusieurs documents de résultat à l'aide de l'instruction xsl:result-document. Le résultat primaire de la transformation est généré pour n'importe quelle arborescence de résultat construite par la feuille de style et non contenue dans une instruction xsl:result-document, ou contenue dans une instruction xsl:result-document ayant un attribut href dont la valeur est une chaîne de longueur nulle. Le résultat primaire est renvoyé à l'application à l'aide des différentes méthodes décrites plus haut.
Si la feuille de style évalue une instruction xsl:result-document ayant un attribut href dont la valeur n'est pas une chaîne de longueur nulle, le résultat est envoyé par défaut à un flux de sortie. Pour déterminer l'URI du flux de sortie, la valeur de l'attribut href est résolue par rapport au paramètre de l'URI de sortie de base défini dans le contexte dynamique.
Pour modifier ce comportement par défaut, vous pouvez fournir une instance de l'interface XResultResolver dans l'objet XDynamicContext utilisé pour la transformation. La méthode getResult de l'interface XResultResolver est alors appelée si des instructions xsl:result-document sont appelées. Le résultat de la méthode getResult est une instance de l'interface Result vers laquelle le résultat de l'instruction xsl:result-document est dirigé. Utiliser l'interface XResultResolver permet à l'application de décider au cas par cas où diriger le résultat de toutes les instructions xsl:result-document présentes dans les feuilles de style. Si votre application n'a pas fourni d'instance de l'interface Result dans la méthode d'exécution de l'interface XSLTExecutable pour le résultat primaire, la méthode getResult de l'interface XResultResolver est appelée pour ce résultat primaire.
Si la méthode getResult de l'interface XResultResolver renvoie une référence nulle, le comportement par défaut est rétabli pour ce résultat, autrement dit le résultat est enregistré dans un flux de sortie s'il s'agit d'un résultat secondaire, ou renvoyé en tant que résultat de la méthode d'exécution sous la forme d'une instance de l'interface XSequenceCursor s'il s'agit du résultat primaire.
L'exemple suivant montre comment utiliser une instance de l'interface XResultResolver pour capturer dans la variable allResults tous les résultats générés par une feuille de style comme des instances de la classe XSequenceCursorResult. L'application peut ensuite extraire l'instance de l'interface XSequenceCursor que chaque instance de la classe XSequenceCursorResult contient à l'aide de la méthode XSequenceCursorResult.getSequenceCursor().
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
Nom du fichier : txml_results_view.html