Le paquetage javax.xml.transform définit plusieurs classes, interfaces et exceptions, destinées à traiter des instructions XSLT et à opérer un processus de transformation d'un document XML vers un résultat XML, HTML, texte ou autres.

L'API Java de transformation fournit la classe Transformer dont les instances ont la fonction principale de transformer une source XML selon des règles de style.

Les instances de la classe Transformer s'obtiennent par le biais de la classe TransformerFactory.

TransformerFactory fabrique = TransformerFactory.newInstance();
Transformer transformeur = fabrique.newTransformer();

Il est possible de passer par un objet intermédiaire Templates, lequel est récupéré à partir de la fabrique TransformerFactory. Un objet implémentant l'interface Templates prépare une représentation spécifique des instructions de transformation XSLT pour leur exécution ultérieure.

XMLReader analyseurSax = XMLReaderFactory.createXMLReader();
InputSource sourceEntree = 
                new InputSource(new FileInputStream("logitheque.xsl"));
SAXSource sourceXSL = new SAXSource(analyseurSax, sourceEntree);

TransformerFactory fabrique = TransformerFactory.newInstance();

Templates modeles = fabrique.newTemplates(sourceXSL);
Transformer transformeur = modeles.newTransformer();
//équivaut à
Transformer transformeur = fabrique.newTransformer(sourceXSL);

La transformation doit s'appuyer sur une source XSLT, soit une feuille de style. C'est pourquoi, les méthodes newTransformer() et newTemplates() attendent un objet Source. Tout objet implémentant l'interface Source peut être utilisé, incluant les sources DOM (javax.xml.transform.dom.DOMSource) et SAX (javax.xml.transform.sax.SAXSource) et les flux (javax.xml.transform.stream.StreamSource).

Si un document XML contient une instruction de traitement xml-stylesheet, la méthode getAssociatedStylesheet() retourne la source XSLT désignée dans ce document, afin de l'exploiter lors de la transformation.

DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
fabrique.setNamespaceAware(true);
fabrique.setValidation(true);
DocumentBuilder analyseur = fabrique.newDocumentBuilder();
Document doc = analyseur.parse(new File("source.xml"));
DOMSource sourceXML = new DOMSource(doc);

TransformerFactory fabrique = TransformerFactory.newInstance();
Source sourceXSL = fabrique.getAssociatedStylesheet(
                                   sourceXML, 
                                   null,
                                   "StyleXSL",
                                   "ISO-8859-1");
Transformer transformeur = fabrique.newTransformer(sourceXSL);

<!-- Fichier : source.xml -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="style.xsl" 
                    type="text/xsl" 
                    title="StyleXSL" 
                    charset="ISO-8859-1"
                    version = "1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                    xmlns="http://www.w3.org/TR/xhtml1/strict"?>
<librairie>
  <!-- ... -->
</librairie>

Il peut être nécessaire d'indiquer à la fabrique DocumentBuilderFactory de prendre en compte les espaces de noms. Dans le cas cntraire, la transformation pourrait ne pas s'exécuter correctement.

La transformation se réalise en appelant la méthode transform() d'un objet Transformer. Il faut passer à cette méthode deux arguments :

  • une source XML Source sur lequel s'appliquera la transformation,
  • un objet Result destiné à récupérer le résultat de la transformation.

L'objet Result peut être un résultat DOM (DOMResult) ou SAX (SAXResult) ou encore un flux (StreamResult). Dans le cas, d'un objet DOMResult ou SAXResult, le résultat peut être exploité directement par l'application. En ce qui concerne le flux StreamResult, le résultat est envoyé dans un fichier, vers une ressource adressée par une URI, au travers d'un socket réseau, vers la sortie standard ou ailleurs.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Properties;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

public class StyleXSLT {
  public static void main(String[] args) {
    try {
      XMLReader analyseurSax = XMLReaderFactory.createXMLReader();
      InputSource sourceEntreeXSL = 
                             new InputSource(
                                 new FileInputStream("logitheque.xsl"));
      SAXSource sourceXSL = 
                               new SAXSource(analyseurSax, sourceEntreeXSL);

      InputSource sourceEntreeXML = 
                             new InputSource(
                                 new FileInputStream("logitheque.xml"));
      SAXSource sourceXML = 
                new SAXSource(analyseurSax, sourceEntreeXML);

      TransformerFactory fabrique = 
                               TransformerFactory.newInstance();
      Transformer transformateur = 
                               fabrique.newTransformer(sourceXSL);

      transformateur.setOutputProperty(
                               OutputKeys.METHOD, "html");
      transformateur.setOutputProperty(
                               OutputKeys.ENCODING, "ISO-8859-1");
      transformateur.setOutputProperty(
                               OutputKeys.INDENT, "yes");

      transformateur.setParameter("num", "6");

      File oFic = new File("resultat.html");
      FileOutputStream fos = new FileOutputStream(oFic);

      if (fos != null) {
        Result sortie = new StreamResult(fos);
        transformateur.transform(sourceXML, sortie);
      }
      fos.flush();
      fos.close();
    }
    catch (TransformerConfigurationException e) {
      e.printStackTrace();
    }
    catch (SAXException e) {
      e.printStackTrace();
    }
    catch (FileNotFoundException e) {
      e.printStackTrace();
    }
    catch (TransformerException e) {
      e.printStackTrace();
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Feuille de style : logitheque.xsl -->
<xsl:stylesheet 
       version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output 
            method="html" 
            encoding="ISO-8859-1"
            media-type="text/html; charset=ISO-8859-1"/>
  <xsl:param name="num">6</xsl:param>
  <xsl:template match="/">
    <xsl:apply-templates 
                    select="/logitheque/categorie[position()=$num]"/>
  </xsl:template>
  <xsl:template match="/logitheque/categorie">
    <html>
      <head>
        <title>
          La logithèque : 
          <xsl:value-of select="/logitheque/categorie[$num]/@nom"/>
        </title>
        <meta name="Robots" content="noindex, nofollow"/>
      </head>
      <body>
        <h1><xsl:value-of select="@nom"/></h1>
        <table border="1" width="100%" class="produit">
          <tr>
            <th colspan="5" class="entete">Logiciel</th>
          </tr>
          <tr>
            <th class="entete" width="35%">Editeur</th>
            <th class="entete" width="10%">Langue</th>
            <th class="entete" width="24%">OS</th>
            <th class="entete" width="25%">Prix</th>
            <th class="entete" style="width: 6%">Panier</th>
          </tr>
          <xsl:apply-templates>
            <xsl:sort select="nom"/>
          </xsl:apply-templates>
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template name="cellule0" match="/logitheque/categorie/logiciel">
    <tr>
      <td colspan="5" class="c1 somniv1" height="24">
        <xsl:choose>
          <xsl:when test="@code != ''">
            <a href="http://aff.soc.fr?var=x12&produit={@code}" target="_blank">
              <xsl:apply-templates select="nom"/>
            </a>
          </xsl:when>
          <xsl:otherwise>
            <a href="{editeur/@lien}" target="_blank">
              <xsl:apply-templates select="nom"/>
            </a>
          </xsl:otherwise>
        </xsl:choose> - <xsl:apply-templates select="./commentaire"/>
      </td>
    </tr>
    <tr>
      <td style="white-space:nowrap">
        <a href="{editeur/@lien}" target="_blank">
          <xsl:apply-templates select="./editeur"/>
        </a>
      </td>
      <td>
        <xsl:apply-templates select="./langue"/>
      </td>
      <td>
        <xsl:apply-templates select="./plateforme"/>
      </td>
      <td>
        <xsl:apply-templates select="./prix"/>
        <xsl:text> </xsl:text>
        <xsl:apply-templates select="prix/@monnaie"/>
      </td>
      <td>
        <xsl:if test="@code != '' ">
          <script 
             src="http://aff.soc.fr?var=x12&produit={@code}&target=_blank"/>
        </xsl:if>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet 
                   type="text/xsl" 
                   href="logitheque.xsl" 
                   title="StyleXSLT"
                   encoding="ISO-8859-1"?>
<!DOCTYPE logitheque SYSTEM "logitheque.dtd">
<logitheque>
  <categorie nom="Edition Web">
    <logiciel code="13404148">
      <nom>Web Expert 2000</nom>
      <commentaire>Editeur HTML professionnel.</commentaire>
      <editeur lien="http://www.visic.com/webexpert/">Visicom</editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">429,00</prix>
    </logiciel>
  </categorie>
  <categorie nom="Dreamweaver">
    <logiciel code="13413363">
      <nom>Dreamweaver 4</nom>
      <commentaire>
        Créez vos pages HTML et gérez votre site Web.
      </commentaire>
      <editeur lien="http://www.macromedia.com/software/">
        Macromedia
      </editeur>
      <langue>US</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">2 508,44</prix>
    </logiciel>
  </categorie>
  <categorie nom="Frontpage">
    <logiciel code="13404422">
      <nom>FrontPage 2000 Media Pack</nom>
      <commentaire>
        Media Pack ne peut être vendu séparément.
      </commentaire>
      <editeur lien="http://www.microsoft.com/">
        Microsoft
      </editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">184,62</prix>
    </logiciel>
  </categorie>
  <categorie nom="Director Shockwave">
    <logiciel code="13406163">
      <nom>Director Shockwave Studio 8.0</nom>
      <commentaire>
        La référence en conception multimedia.
      </commentaire>
      <editeur lien="http://www.macromedia.com/software/">
        Macromedia
      </editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">2 558,52</prix>
    </logiciel>
  </categorie>
  <categorie nom="Feuille de Style">
    <logiciel code="">
      <nom>TopStyle Pro 2.1</nom>
      <commentaire>
        La version 2.5 disponible en Beta test.
      </commentaire>
      <editeur lien="http://www.bradsoft.com/topstyle/">
        Bradbury Software
      </editeur>
      <langue>EN</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="$US">49,95</prix>
    </logiciel>
  </categorie>
  <categorie nom="XML et XSL">
    <logiciel code="">
      <nom>Cooktop  2.200</nom>
      <commentaire>
        Un éditeur XML, XSLT, XPath et DTD puissant et totalement gratuit.
      </commentaire>
      <editeur lien="http://xmleverywhere.com/cooktop/">
         XML Everywhere
       </editeur>
      <langue>EN</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="$US">00.00</prix>
    </logiciel>
    <logiciel code="">
      <nom>XML Spy 3.5</nom>
      <commentaire>La version 4 bientôt disponible.</commentaire>
      <editeur lien="http://www.xmlspy.com/default.html">
        Altova Inc.
      </editeur>
      <langue>EN</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="$US">199,00</prix>
    </logiciel>
  </categorie>
  <categorie nom="Base de données">
    <logiciel code="13414437">
      <nom>Borland Kylix Developpement Desktop</nom>
      <commentaire>
        Développement serveur et base de données pour réaliser 
        rapidement des applications web évolutives.
      </commentaire>
      <editeur lien="">Borland</editeur>
      <langue>FR</langue>
      <plateforme>Win/Linux</plateforme>
      <prix monnaie="FRF">1 502,00</prix>
    </logiciel>
  </categorie>
  <categorie nom="Java">
    <logiciel code="11406923">
      <nom>JBuilder 4.0 Entreprise</nom>
      <commentaire>
        Développement d'applications Java.
      </commentaire>
      <editeur lien="http://www.borland.com/">
        Borland
      </editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">22 105,00</prix>
    </logiciel>
    <logiciel code="11414012">
      <nom>Eclipse 3.0</nom>
      <commentaire>
        Développement d'applications Java.
      </commentaire>
      <editeur lien="http://www.eclipse.org/">
        Fondation Eclipse
      </editeur>
      <langue>US</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">0</prix>
    </logiciel>
  </categorie>
  <categorie nom="Visual Basic">
    <logiciel code="11400283">
      <nom>Visual Basic 6.0 Professionnel</nom>
      <commentaire>
        Le célèbre outil de développement.
      </commentaire>
      <editeur lien="http://www.microsoft.com/">
        Microsoft
      </editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">3 855,17</prix>
    </logiciel>
  </categorie>
  <categorie nom="Delphi">
    <logiciel code="13400140">
      <nom>Delphi 5 Professionnel</nom>
      <commentaire>
        Le développement ultrarapide pour windows.
      </commentaire>
      <editeur lien="http://www.borland.com/">
        Borland
      </editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">5 995,00</prix>
    </logiciel>
  </categorie>
  </categorie>
  <categorie nom="Navigateur">
    <logiciel code="">
      <nom>Netscape 6.1</nom>
      <commentaire>
        La dernière version totalement refondue de Netscape.
      </commentaire>
      <editeur lien="http://home.netscape.com/download/index.html">
        Netscape
      </editeur>
      <langue>FR</langue>
      <plateforme>Win/Mac/Linux</plateforme>
      <prix monnaie="FRF">00,00</prix>
    </logiciel>
  </categorie>
  <categorie nom="Client FTP">
    <logiciel code="13414140">
      <nom>WS_FTP Pro (1 utilisateur)</nom>
      <commentaire>
        La nouvelle version, exclusivement en anglais.
      </commentaire>
      <editeur lien="http://www.ipswitch.com/products/index.html">
        Ipswitch
      </editeur>
      <langue>US</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">417,40</prix>
    </logiciel>
  </categorie>
  <categorie nom="Recherche">
    <logiciel code="">
      <nom>SubmitWolf v4.02.003 MAJ</nom>
      <commentaire>
        SubmitWolf est un outil professionnel de promotion de sites Web.
      </commentaire>
      <editeur lien="http://www.trellian.com//fr/products.htm">
        Trellian Soft.
      </editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="$US">100,00</prix>
    </logiciel>
  </categorie>
  </categorie>
  <categorie nom="Graphisme Web">
    <logiciel code="13413372">
      <nom>Fireworks 4</nom>
      <commentaire>Optimisez vos images pour le web.</commentaire>
      <editeur lien="http://www.macromedia.com/software/">
        Macromedia
      </editeur>
      <langue>US</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">2 508,69</prix>
    </logiciel>
    <logiciel code="13406152">
      <nom>Flash 5.0</nom>
      <commentaire>
        Créez des sites web avec animations vectorielles.
      </commentaire>
      <editeur lien="http://www.macromedia.com/software/">
        Macromedia
      </editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">3 087,11</prix>
    </logiciel>
    <logiciel code="15213947">
      <nom>Paint Shop Pro 7 -Licence 10 à 49 postes</nom>
      <commentaire>
        La nouvelle version du celèbre logiciel graphique en anglais.
      </commentaire>
      <editeur lien="http://www.wska.com/">Wska</editeur>
      <langue>FR</langue>
      <plateforme>Win</plateforme>
      <prix monnaie="FRF">575,00</prix>
    </logiciel>
  </categorie>
</logitheque>