Accueil
Accueil
Le
Club
Delphi
Kylix
C
C++
Java
J2EE
DotNET
& C#
Visual
Basic
Access
Pascal
Dev
Web
PHP
ASP
XML
UML
SQL
SGBD
Win
Linux
Autres



Comment fonctionne l'API XSLT ?
auteur : Ioan Calapodescu
Architecture d'une application utilisant XSLT :

Source image : J2EE 1.4 Tutorial
L'application commence par récupérer un transformeur (javax.xml.transform.Transformer) à partir d'une fabrique de transformeurs (javax.xml.transform.TransformerFactory).

C'est ce transformeur qui va être chargé de transformer une source (javax.xml.transform.Source) en résultat (javax.xml.transform.Resultat). Par défaut, si aucune véritable transformation n'est demandée, le transformeur va simplement copier la source dans le résultat.

La source et le résultat peuvent être respectivement un parseur SAX, un DOM, une InputSource et un ensebble d'évènements SAX, un DOM ou une OutputSource.

Pour une configuration pratique du transformeur, regardez : Comment créer et configurer un Transformer (pour SAX et DOM) ?


lien : Comment créer et configurer un Transformer (pour SAX et DOM) ?
lien : Comment créer ou modifier un fichier XML avec DOM et XSLT ?
lien : Comment créer ou modifier un fichier XML avec SAX et XSLT ?

Comment créer et configurer un Transformer (pour SAX et DOM) ?
auteur : Ioan Calapodescu
Voici un exemple de création et de configuration d'un Transformer :

// création de la fabrique TransformerFactory fabrique = TransformerFactory.newInstance(); // récupération du transformeur Transformer transformer = fabrique.newTransformer(); /** * pour définir une feuille de style, vous pouvez utiliser une Source comme paramètre * File stylesheet = new File("stylesheet.xsl"); * StreamSource stylesource = new StreamSource(stylesheet); * Transformer transformer = fabrique.newTransformer(stylesource); */ // configuration du transformeur transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
Pour configurer votre fabrique, regardez par exemple : Comment gérer les erreurs durant la transformation ? .

Pour connaître toutes les clefs disponibles pour le Transformer, regardez la classe javax.xml.transform.OutputKeys.

lien : Comment gérer les erreurs durant la transformation ?

Que sont les Templates crées par TransformerFactory?
auteur : Ioan Calapodescu
Les fabriques de transformeurs (javax.xml.transform.TransformerFactory) peuvent construire deux types d'objets : les Transformer et les Templates.

Une Template est un "conteneur" de Transformer. De plus, contrairement à un simple Transformer, la Template est "thread-safe" (elle peut être utilisée par plusieurs Threads sans risque).

La création et configuration d'une Template se font de la même manière que pour un Transformer. Par exemple :

// création de la fabrique TransformerFactory fabrique = TransformerFactory.newInstance(); // récupération de Templates Templates template = fabrique.newTemplates(); /** * pour définir une feuille de style, vous pouvez utiliser une Source comme paramètre * File stylesheet = new File("stylesheet.xsl"); * StreamSource stylesource = new StreamSource(stylesheet); * Templates template = fabrique.newTemplates(stylesource); */ // configuration du transformeur Transformer transformer = template.getTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
lien : Comment créer et configurer un Transformer (pour SAX et DOM) ?

Comment gérer les erreurs durant la transformation ?
auteur : Ioan Calapodescu
La gestion des erreurs se fait de la même manière que pour SAX/DOM et les ErrorHandler. On peut gérer les erreurs durant la transformation avec un ErrorListener (javax.xml.transform). Par exemple :

import javax.xml.transform.*; public class EcouteurDErreurs implements ErrorListener{ public void warning(TransformerException exception) throws TransformerException{ printException(exception); } public void error(TransformerException exception) throws TransformerException{ printException(exception); } public void fatalError(TransformerException exception) throws TransformerException{ printException(exception); throw exception; } private void printException(TransformerException exception){ String message = exception.getMessageAndLocation() ; System.out.println(message); } }
Utilisation :

Transformer transformeur = ...; transformeur.setErrorListener(new EcouteurDErreurs());
lien : Comment gérer les erreurs durant le parsing ?
lien : Comment gérer les erreurs durant la création d'un DOM ?

Comment créer ou modifier un fichier XML avec DOM et XSLT ?
auteur : Ioan Calapodescu
Voici une méthode permettant de créer un fichier XML à partir d'un DOM :

public static void transformerXml(Document document, String fichier) { try { // Création de la source DOM Source source = new DOMSource(document); // Création du fichier de sortie File file = new File(fichier); Result resultat = new StreamResult(fichier); // Configuration du transformer TransformerFactory fabrique = TransformerFactory.newInstance(); Transformer transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformation transformer.transform(source, resultat); }catch(Exception e){ e.printStackTrace(); } }
Vous pouvez télécharger les sources d'un exemple complet ci-dessous.

lien : Comment créer ou modifier un fichier XML avec SAX et XSLT ?
lien : Comment créer un fichier HTML à partir d'un XML ?
lien : Comment créer un fichier PDF à partir d'un XML ?
téléchargement : CreationDOM.zip

Comment créer ou modifier un fichier XML avec SAX et XSLT ?
auteur : Ioan Calapodescu
Pour créer un fichier XML avec SAX et XSLT, il nous faut créer une SAXSource. Nous allons prendre l'exemple de l'écriture dans un fichier d'un "annuaire" composé d'une List de JavaBean Personne. Voici les étapes nécessaires à sa création de la source :

  • Création du bean : Personne définit un élément de l'annuaire..
  • Création d'une InputSource : AnnuaireSource définit la List des personnes de l'annuaire.
  • Création d'un XMLReader : AnnuaireReader est capable de "parser" la source pour lever des évènements SAX.
  • Création de la SAXSource, à partir de l'InputSource et du Reader.

Après celà la transformation se fera comme pour un arbre DOM et un fichier : avec un Transformer et un StreamResult (pour le fichier de destination).

Personne
/** * Voir zip */
AnnuaireSource
public class AnnuaireSource extends InputSource{ private List<Personne> personnes; public AnnuaireSource(List<Personne> personnes){ super(); this.personnes = personnes; } public List<Personne> getPersonnes(){ return personnes; } // En fait, contrairement à cet exemple de nombreuses méthodes d'InputSource travaillent avec des streams. // Cela peut vous simplifier le travail sur des fichiers XML existants. }
AnnuaireReader
public class AnnuaireReader implements XMLReader{ private ContentHandler handler; private AttributesImpl atts = new AttributesImpl(); //méthode qui vont être utilisées par le transformer public ContentHandler getContentHandler(){ return handler; } public void setContentHandler(ContentHandler handler){ this.handler = handler; } // parsing d'une liste de personnes public void parse(InputSource input) throws IOException,SAXException{ if(!(input instanceof AnnuaireSource)){ String m = "Le seul argument possible pour parse est une AnnuaireSource"; throw new SAXException(m); } if(handler == null){ throw new SAXException("Pas de ContentHandler"); } AnnuaireSource source = (AnnuaireSource)input; List<Personne> personnes = source.getPersonnes(); handler.startDocument(); handler.startElement("", "annuaire", "annuaire", atts); for(Personne p : personnes){ atts.addAttribute("","id","id","",String.valueOf(p.getId())); handler.startElement("", "personne", "personne", atts); atts.clear(); handler.startElement("", "nom", "nom", atts); char[] nom = p.getNom().toCharArray(); handler.characters(nom,0,nom.length); handler.endElement("", "nom", "nom"); handler.startElement("", "prenom", "prenom", atts); char[] prenom = p.getPrenom().toCharArray(); handler.characters(prenom,0,prenom.length); handler.endElement("", "prenom", "prenom"); handler.startElement("", "adresse", "adresse", atts); char[] adresse = p.getAdresse().toCharArray() ; handler.characters(adresse,0,adresse.length); handler.endElement("", "adresse", "adresse"); handler.endElement("", "personne", "personne"); } handler.endElement("", "annuaire", "annuaire"); handler.endDocument(); } public void parse(String systemId) throws IOException,SAXException{ String m = "Le seul argument possible pour parse est une AnnuaireSource"; throw new SAXException(m); } // autres méthodes à implémenter }
Exemple d'utilisation :

// Création de l'annuaire List<Personne> annuaire = new ArrayList<Personne>(); // ... //remplissage de l'annuaire // Création de la source DOM XMLReader annuaireReader = new AnnuaireReader(); InputSource annuaireSource = new AnnuaireSource(annuaire); Source source = new SAXSource(annuaireReader, annuaireSource); // Création du fichier de sortie File file = new File("CreationSAX.xml"); Result resultat = new StreamResult(file); // Configuration du transformer TransformerFactory fabrique = TransformerFactory.newInstance(); Transformer transformer = fabrique.newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); // Transformation transformer.transform(source, resultat);
Téléchargez le code source complet ci-dessous.

lien : Comment créer ou modifier un fichier XML avec DOM et XSLT ?
lien : Comment créer un fichier HTML à partir d'un XML ?
lien : Comment créer un fichier PDF à partir d'un XML ?
téléchargement : SaxXSLT.zip

Comment créer un fichier HTML à partir d'un XML ?
auteur : Ioan Calapodescu
La création d'un document HTML avec XSLT passe par l'utilisation d'une feuille de style (XSL). Voici le code à utiliser :

public static void creerHTML(String xml, String xsl, String html) throws Exception{ // Création de la source DOM DocumentBuilderFactory fabriqueD = DocumentBuilderFactory.newInstance(); DocumentBuilder constructeur = fabriqueD.newDocumentBuilder(); File fileXml = new File(xml); Document document = constructeur.parse(fileXml); Source source = new DOMSource(document); // Création du fichier de sortie File fileHtml = new File(html); Result resultat = new StreamResult(fileHtml); // Configuration du transformer TransformerFactory fabriqueT = TransformerFactory.newInstance(); StreamSource stylesource = new StreamSource(xsl); Transformer transformer = fabriqueT.newTransformer(stylesource); transformer.setOutputProperty(OutputKeys.METHOD, "html"); // Transformation transformer.transform(source, resultat); }
Vous pouvez télécharger ci-dessous un exemple simple avec xml, xsl et classe de test.

lien : Comment créer ou modifier un fichier XML avec DOM et XSLT ?
lien : Comment créer un fichier PDF à partir d'un XML ?
téléchargement : CreationHTML.zip

Comment créer un fichier PDF à partir d'un XML ?
auteur : Ioan Calapodescu
L'API standard ne fournit pas de mécanisme pour transformer un XML en PDF. Par contre, une très bonne librairie existe pour ca : FOP (Formatting Object Processor). Voici un exemple d'utilisation de FOP :

public static void creerPDF(String xml, String xsl, String pdf) throws Exception{ // création du résultat (pdf) Driver driver = new Driver(); driver.setRenderer(Driver.RENDER_PDF); driver.setOutputStream(new java.io.FileOutputStream(pdf)); Result resultat = new SAXResult(driver.getContentHandler()); // récupération de la source xml Source source = new StreamSource(xml); // création du transformer en fonction du xsl Source style = new StreamSource(xsl); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(style); // transformation transformer.transform(source, resultat); }
Vous pouvez télécharger un exemple complet avec xml et xsl ci dessous. Verifiez bien que la librairie FOP (et ses dépendances) se trouve bien dans votre classpath avant de compiler/exécuter l'exemple.

lien : Comment créer un fichier HTML à partir d'un XML ?
téléchargement : CreationPDF.zip

Comment enchaîner les transformations XSLT ?
auteur : Ioan Calapodescu
Vous pouvez très bien vouloir enchaîner les transformations XSLT. Par enchaîner, on entend appliquer plusieurs transformations successives à un document XML. Chaque résultat de transformation devenant ainsi la source de la prochaine. Pour vous aider à faire ceci, le package org.xml.sax vous propose la classe XMLFilter. Voici le principe :

Source image = J2EE 1.4 Tutorial
Voici une méthode prenant en arguments un fichier XML, deux feuilles de style xsl (les transformations à enchaîner) et un fichier html de sortie.

public static void transformer(File xml, File xsl1, File xsl2, File html) throws Exception{ // Création du reader initial SAXParserFactory spf = SAXParserFactory.newInstance(); spf.setNamespaceAware(true); XMLReader reader = spf.newSAXParser().getXMLReader(); // Création des filtres à appliquer au reader SAXTransformerFactory stf = (SAXTransformerFactory)TransformerFactory.newInstance(); XMLFilter filtre1 = stf.newXMLFilter(new StreamSource(xsl1)); XMLFilter filtre2 = stf.newXMLFilter(new StreamSource(xsl2)); // On "lie" le reader aux filtres filtre1.setParent(reader); filtre2.setParent(filtre1); // Création de la source : c'est le dernier filtre de la chaîne // C'est lui qui indiquera au transformer quelles transformations à faire "avant" // Le résultat est le fichier HTML SAXSource source = new SAXSource(filtre2, new InputSource(new FileInputStream(xml))); StreamResult resultat = new StreamResult(new FileOutputStream(html)); //Transformation en chaîne Transformer transformer = stf.newTransformer(); transformer.transform(source, resultat); }
Vous pouvez télécharger un exemple complet d'utilisation ci-dessous.

téléchargement : ChaineXSLT.zip


Consultez les autres F.A.Q's

Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs.

Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs :

- Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".

- Pour ce qui est des autres contributions : Copyright © 2004 Developpez LLC : Tous droits réservés Developpez LLC. Aucune reproduction, ne peux en être faite sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright 2000..2004 www.developpez.com