Circum Blog

Circum Net – IT – Conseils pratiques

Transformation XSLT avec Java

Java, Programmation, XML, XSLT

Pour obtenir une transformation d’un document XML par une feuille XSL on peut invoquer un “transformeur” (javax.xml.transform.Transformer) à partir d’une fabrique de transformeurs (javax.xml.transform.TransformerFactory).

Ce transformeur va prendre en charge la transformation de la source XML via sa méthode “transform”. Par défaut, si aucune feuille XSL n’est passée en argument, le transformeur va se contenter de copier la source dans le résultat.

Voyons à présent comment tout cela est mis en oeuvre concrètement.

Tout d’abord, prenons connaissance du document XML source qui va faire l’objet de la transformation:

Fichier source XML : members.xml

<?xml version=”1.0″ encoding=”iso-8859-1″?>
<members date=”2008/07/09″ context=”dbaccess”>
  <member privilege=”admin”>
    <name>John Reese</name>
    <id>3674</id>
    <login>jreese</login>
  </member>
  <member privilege=”collaborator”>
    <name>Robin Wright</name>
    <id>36555</id>
    <login>rwright</login>
  </member>
  <member privilege=”guest”>
    <name>Peter Crows</name>
    <id>333676</id>
    <login>pcrows</login>
  </member>
</members>

Ensuite, considérons la feuille de styles XSL qui est aux commandes de la transformation :

Fichier source XSL : members.xsl

<?xml version=”1.0″?>
<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” version=”1.0″>
<xsl:template match=”/”>
  <html>
  <head><title>Members List</title></head>
  <body>
  <table border=”1″>
  <tr>
  <th>id</th>
  <th>name</th>
  </tr>
  <xsl:for-each select=”members/member”>
    <tr>
    <td><xsl:value-of select=”id”/></td>
    <td><xsl:value-of select=”name”/></td>
    </tr>
  </xsl:for-each>
  </table>
  </body></html>
</xsl:template>
</xsl:stylesheet>

Enfin, il nous faut écrire le code Java qui joue le rôle de chef d’orchestre et lance la transformation :

import java.io.*;

import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/* Transformation XSL  */
public class XSLTransform
  {
  public static void main(String[] args) 
    {
    try 
      {
      // Chargement de la source XML
      StreamSource xmlSource = new StreamSource("members.xml");

      // Chargement de la feuille XSL
      StreamSource xsltSource = new StreamSource("members.xsl");

      // Préparation du fichier résultat
      FileOutputStream fResult = new FileOutputStream("members.html")
      StreamResult transResult = new StreamResult(fResult);
      
      TransformerFactory transFact = TransformerFactory.newInstance();
      
      Transformer trans = transFact.newTransformer(xsltSource);
      trans.transform(xmlSource, transResult);
      }
    catch (Exception e) 
      {
      e.printStackTrace( );
      }
    }
  }