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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Problème de XSLT appliqué sur un XML généré en SAX [SAX]


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Par défaut Problème de XSLT appliqué sur un XML généré en SAX
    Bonjour à tous!
    Je viens vers vous car je rencontre un problème pour appliquer un XSLT sur un XML que je génère avec SAX à partir d'une base de données (MySQL).

    Mon projet est une application web sur Tomcat, je renvoi donc le résultat de la conversion [Base de données --> XML] sur le PrintWriter du HttpServletResponse.

    Voila comment je génère le XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    StreamResult streamResult = new StreamResult(writer);
    SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
     
    if(xslt != null)
    {
    	Templates templates = tf.newTemplates(new StreamSource( new File(xslt)));
    	hd = tf.newTransformerHandler(templates);
    }
    else
    	hd = tf.newTransformerHandler();
     
    Transformer serializer = hd.getTransformer();
     
    serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
     
    if(dtd != null)
    	serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, dtd);
     
     
    atts = new AttributesImpl();
     
    hd.setResult(streamResult);
    hd.startDocument();
     
    this.generateNode(); //Je crée dans cette méthode les différents éléments de mon XML 
     
    hd.endDocument();
    Quand je ne définis pas la variable "xslt" mon XML est renvoyé correctement.
    Quand je définis cette variable avec le path de mon fichier xsl, la définition du xslt est suivie (dans le <xsl:template match="/">) jusque au moment ou <xsl:apply-templates /> est appelé.

    Pour mieux comprendre voici un exemple du xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <films>
    	<film>
    		<film_film_id>1</film_film_id>
    		<film_title>ACADEMY DINOSAUR</film_title>
    		<actors>
    			<actor>
    				<actor_first_name>PENELOPE</actor_first_name>
    				<actor_last_name>GUINESS</actor_last_name>
    			</actor>
    			...
    		</actors>
    	</film>
    	...
    </films>
    Et du XSLT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" />
    <xsl:template match="/">
    	<html>
    	<head>
    		<title>Test</title>
    	</head>
    	<body>
    		<span style="color:red;">Coucou</span>
    		<xsl:apply-templates /> 
    	</body>
    	</html>
    </xsl:template>
     
    <xsl:template match="film">
    	<p>TOTO</p>
    </xsl:template>
     
    </xsl:stylesheet>
    Le template match="film" n'est jamais appelé, et ça me donne un résultat comme celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <html>
    	<head>
    		<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    		<title>Test</title>
    	</head>
    	<body>
    		<span style="color:red;">Coucou</span>1ACADEMY DINOSAUR2006-01-0186A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies1PENELOPEGUINESS1CHRISTIANGABLE1LUCILLETRACY1SANDRAPECK .............
    	</body>
    </html>
    Le problème vient vraiment du code java car j'ai testé le xslt sur le xml sans passer par le code.

    J'espere que mes explications sont compréhensibles !
    Si quelqu'un peut m'aider car je deviens complètement fou ! ^^
    Merci d'avance!

  2. #2
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Il vaut mieux toujours de faire faire le progrès de la chaîne de matches avec plus de clarté et sans ambiguïté en évitant les effets des templates défauts même qu'ils soient désirables ou désirés.

    Dans ce cas, remplacez xs:apply-templates par ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="films/film" />

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Par défaut
    Merci tsuji d'avoir répondu.

    J'ai donc déjà essayer tout ce qui était possible du coté du xslt (dont le select), et celui-ci marche très bien, car en enregistrant le xml généré (sans appliquer le xslt dans le code java) dans un fichier et en y mettant un "xml-stylesheet" tout marche bien.

    Je vais essayer dans le code java de ne pas appliquer le xslt directement sur le xml généré mais après avoir terminé de le générer pour voir ci cela peut être ça.

    Je reviens vers vous pour vous dire le résultat.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Par défaut
    C'est bon j'ai résolu mon problème !

    Pour ceux que ça intéresse voila la solution.

    J'ai créé mon xml dans un nouveau OutputStream pour ensuite appliquer la transformation avec le xslt sur ce OutputStream et renvoyer le résultat sur mon PrintWrite.

    Voila le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ByteArrayOutputStream outputXml = new ByteArrayOutputStream();
    StreamResult streamResult = new StreamResult(outputXml);
    SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
     
    hd = tf.newTransformerHandler();
     
    Transformer serializer = hd.getTransformer();
     
    serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    serializer.setOutputProperty(OutputKeys.INDENT, "yes");
     
    if(dtd != null)
    	serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, dtd);
     
     
    atts = new AttributesImpl();
     
    hd.setResult(streamResult);
    hd.startDocument();
     
    this.generateNode();
     
    hd.endDocument();
     
    SAXTransformerFactory tf2 = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
    TransformerHandler finalHD;
    if(xslt != null)
    {
    	Templates templates = tf2.newTemplates(new StreamSource( new File(xslt)));
    	finalHD = tf2.newTransformerHandler(templates);
    }
    else
    	finalHD = tf2.newTransformerHandler();
     
    Transformer t = finalHD.getTransformer();
    t.transform(new StreamSource(new ByteArrayInputStream(outputXml.toByteArray())), new StreamResult(writer));

  5. #5
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1
    Par défaut postgré xml sax xslt
    Bonjour,
    S'il t plaît peux-tu me montrer le pseudo code de ta metode generateNode? je travail sur un projet similaire, mais je suis bloqué à ce niveau.merciii!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2007, 14h08
  2. Problème requete sur champs xml
    Par fred6655 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/09/2006, 13h19
  3. [XSLT] Appliquer un traitement xslt sur un fichier XML distant
    Par mabig dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 14/03/2006, 09h38
  4. Executer une feuille XSLT sur du xml
    Par naiadeKaren dans le forum Général Python
    Réponses: 2
    Dernier message: 24/08/2005, 14h53
  5. [XSLT]select sur plusieur documents XML
    Par jesus144 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 15/06/2005, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo