Sérialisation des résultats
Quand votre application a évalué une expression XPath ou XQuery, ou exécuté une transformation d'une feuille de style XSLT, vous souhaitez parfois générer le résultat sous la forme d'un document XML représenté par un fichier ou une chaîne Java™. Le processus permettant de générer une sortie sous la forme d'un document XML est appelé la "sérialisation".
Procédure
- Sérialiser une instance de XSequenceCursor
Votre application peut appeler la méthode XSequenceCursor.exportSequence pour sérialiser une séquence représentée par une instance de l'interface XSequenceCursor. Les arguments pris en charge par cette méthode sont une instance de l'interface javax.xml.transform.Result et, en option, une instance de l'interface XOutputParameters.
Si l'instance de l'interface Result est aussi une instance de la classe javax.xml.transform.stream.StreamResult la séquence est sérialisée comme le décrit le document Recommandations pour la sérialisation dans XSLT 2.0 et XQuery 1.0. L'objet StreamResult peut contenir une instance de la classe java.io.Writer, ou de la classe java.io.OutputStream, avec laquelle le processeur écrira la séquence sérialisée.
Vous pouvez créer une instance de l'interface XOutputParameters en appelant XFactory.newOutputParameters() puis les méthodes appropriées sur cet objet pour remplacer les paramètres de sérialisation par défaut.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath("/purchaseOrder/item[@price > 1000]"); XSequenceCursor exprResult = expr.execute(new StreamSource(inputFile)); System.out.println("Items purchased costing more than $1000"); if (exprResult != null) { // Set indenting in order to pretty-print result XOutputParameters params = factory.newOutputParameters(); params.setIndent(true); exprResult.exportSequence(new StreamResult(System.out), params); } else { System.out.println("None found"); }
Vous pouvez également appeler l'une des méthodes getOutputParameters() sur une instance de l'interface XSLTExecutable pour obtenir les paramètres de sérialisation associés à une définition de sortie particulière dans une feuille de style XSLT. Utilisez la méthode XSLTExecutable.getOutputParameters(javax.xml.namespace.QName) pour obtenir les paramètres de sérialisation d'une définition de sortie désignée, ou bien la méthode sans argument XSLTExecutable.getOutputParameters() pour obtenir ceux de la définition de sortie sans nom. Vous pouvez exécuter cette opération quand vous souhaitez appliquer d'autres traitements au résultat de la transformation avec l'instance de l'interface XSequenceCursor que la transformation génère avant de sérialiser le résultat. Si vous changez les paramètres de la sérialisation dans l'instance de l'interface XOutputParameters renvoyée par l'une des méthodes XSLTExecutable.getOutputParameters(), cela n'affectera pas la définition de sortie contenue dans la feuille de style.XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); XSequenceCursor xformResult = style.execute(new StreamSource("purchase.xml"); XOutputParameters params = style.getOutputParameters(new QName("my-output-definition")); params.setMethod(XOutputParameters.METHOD_XHTML); xformResult.exportSequence(new StreamResult("output.html"), params);
Notez que le document Recommandations pour la sérialisation dans XSLT 2.0 et XQuery 1.0 précise qu'une erreur se produit si la séquence à sérialiser contient des noeuds d'attribut ou des noeuds d'espace de nom. Si vous pensez que la séquence à sérialiser peut contenir des noeuds d'attribut ou d'espace de nom, récupérez les valeurs de ces noeuds sous forme de chaînes (ou un autre type de données approprié) et sérialisez ces valeurs.
- Sérialiser un élément unique.
Vous pouvez également sérialiser uniquement l'élément actif dans une instance de l'interface XSequenceCursor à l'aide d'une des méthodes exportItem. Les méthodes exportItem sont héritées de l'interface XItemView et elles peuvent donc aussi s'appeler depuis une instance de cette interface.
Comme avec la méthode exportSequence décrite précédemment, les arguments pris en charge par cette méthode sont une instance de l'interface javax.xml.transform.Result et, en option, une instance de l'interface XOutputParameters. La méthode exportItem produit le même résultat que la méthode exportSequence, avec une séquence qui ne contient qu'un seul élément.
- Sérialiser directement le résultat d'une transformation ou d'une requête Votre application peut aussi sérialiser le résultat d'une transformation XSLT ou d'une expression XQuery directement en fournissant une instance de l'interface javax.xml.transform.Result dans la méthode XSLTExecutable.execute ou la méthode XQueryExecutable.execute. Les valeurs des paramètres de sérialisation sont déterminées par les attributs de toute déclaration xsl:output applicable ou de toute instruction xsl:result-document dans le cas d'une feuille de style XSLT. Ce sont toujours les valeurs par défaut dans le cas du résultat d'une expression XQuery.
XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); style.execute(new StreamSource("purchase.xml"), new StreamResult("output.xml"));
Si votre application fournit une instance de l'interface XResultResolver dans une transformation, elle peut diriger chaque arborescence de résultat finale vers une destination différente.
- Utiliser la transformation d'identité
Vous pouvez utiliser l'API XML pour transformer les données XML contenues dans une instance de javax.xml.transform.Source directement en une instance de javax.xml.transform.Result. C'est ce qu'on appelle communément la "transformation d'identité". Voir Exécution d'opérations de base avec XSLT pour obtenir un exemple.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_results_serial
Nom du fichier : txml_results_serial.html