IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

FAQ Java XMLConsultez toutes les FAQ

Nombre d'auteurs : 5, nombre de questions : 59, derni�re mise � jour : 3 septembre 2014  Ajouter une question

 

Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.

Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.

SommaireXSLT (9)
pr�c�dent sommaire suivant
 

Architecture d'une application utilisant XSLT :



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 ensemble 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) ?

Pour des exemples, regardez : Comment cr�er ou modifier un fichier XML avec DOM et XSLT ? et Comment cr�er ou modifier un fichier XML avec SAX et XSLT ?

Mis � jour le 5 d�cembre 2004 Ioan

Voici un exemple de cr�ation et de configuration d'un Transformer :

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 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.

Mis � jour le 5 d�cembre 2004 Ioan

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 :

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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");

Mis � jour le 12 d�cembre 2004 Ioan

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 :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 :

Code java : S�lectionner tout
1
2
Transformer transformeur = ...;  
transformeur.setErrorListener(new EcouteurDErreurs());

Mis � jour le 12 d�cembre 2004 Ioan

Voici une m�thode permettant de cr�er un fichier XML � partir d'un DOM :

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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 
		FileOutputStream out = new File(fichier); 
		Result resultat = new StreamResult(out); 
  
		// 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); 
  
                resultat.getOutputStream().close(); 
	}catch(Exception e){ 
		e.printStackTrace(); 
	} 
}
Vous pouvez t�l�charger les sources d'un exemple complet ci-dessous.

Mis � jour le 4 d�cembre 2004 Ioan

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 � la 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 cela la transformation se fera comme pour un arbre DOM et un fichier : avec un Transformer et un StreamResult (pour le fichier de destination).

Code Java : S�lectionner tout
1
2
3
/** 
* Voir zip 
*/
Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
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. 
}
Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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 :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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.

Mis � jour le 4 d�cembre 2004 Ioan

La cr�ation d'un document HTML avec XSLT passe par l'utilisation d'une feuille de style (XSL). Voici le code � utiliser :

Code java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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.

Mis � jour le 4 d�cembre 2004 Ioan

L'API standard ne fournit pas de m�canisme pour transformer un XML en PDF. Par contre, une tr�s bonne librairie existe pour �a : FOP (Formatting Object Processor) . Voici un exemple d'utilisation de FOP :

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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. V�rifiez bien que la librairie FOP (et ses d�pendances) se trouve dans votre classpath avant de compiler/ex�cuter l'exemple.

Mis � jour le 4 d�cembre 2004 Ioan

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 :



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.

Code Java : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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.

Mis � jour le 1er f�vrier 2005 Ioan

Proposer une nouvelle r�ponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.