Indentation d’un document XML avec une feuille de style XSLT

L’élément <xsl:output> d’une feuille XSLT contient un attribut « indent » qui peut prendre 2 valeurs « yes/no ». La valeur « yes » indique que le résultat de l’opération doit être indenté conformément à la structure hierarchique du document XML.

Mais vous aurez probablement constaté que le résultat n’est pas forcément conforme aux attentes. En fait, cela dépend du processeur XLST qui exécute la directive. La spécification XSLT (cf http://www.w3.org/TR/xslt) précise d’ailleurs  » If an XSLT processor outputs the result tree, it should do so as specified by the xsl:output element; however, it is not required to do so. ».

Heureusement certaines implémentations permettent de mettre en forme le résutats de la transformation: par exemple xalan. Voici un exemple de feuille de style, ou vous noterez la définition de l’espace de nomage de xalan, et l’attribut « indent-amount » permettant de spécifier le nombre d’espace à ajouter lors de l’indentation des éléments.

<?xml version= »1.0″ encoding= »ISO-8859-1″?>
<xsl:stylesheet version= »1.0″ xmlns:xsl= »http://www.w3.org/1999/XSL/Transform » xmlns:xalan= »http://xml.apache.org/xalan« >
<xsl:output method= »xml » indent= »yes » xalan:indent-amount= »5″/>
<xsl:strip-space elements= »* »/>
<xsl:template match= »/ »>
<xsl:copy-of select= ». »/>
</xsl:template>
</xsl:stylesheet>

La classe de test suivante vous permettra de valider rapidement que la mise en forme correspond à vos attentes.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
File stylesheet = new File(argv[0]);
File datafile = new File(argv[1]);
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(datafile);
// Use a Transformer for output
TransformerFactory tFactory = TransformerFactory.newInstance();
StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = tFactory.newTransformer(stylesource);
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);

Pour finir la commande permettant de tester la transformation du document (à condition que tous les fichiers soient déployés dans le même répertoire).
java -cp xalan.jar;. -Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl   <maClasse> <maFeuilleXLST>  <monXML>

Publicités

A propos jlerbsc

founder of JavaPerf Consulting Http://www.jperf.com
Cet article a été publié dans tech notes. Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s