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 :

Xpath evaluate problème encodage


Sujet :

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

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut Xpath evaluate problème encodage
    Bonjour,

    Je n'ai pas beaucoup d'expérience en ce domaine c'est pourquoi je fais appel à votre aide.

    Je vais simplifier au plus la chose pour être bref:

    J'ai un fichier XML qui possède la structure suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?xml version="1.0" encoding="UTF-8"?>
       ...
       <variable>
          <value>France</value>
       </variable>
       <variable>
          <value>Grèce</value>
       </variable>
       ...
    </xml>

    Avec une classe Java, je veux obtenir les valeurs qui se trouvent entre les tags "value". Voilà ma méthode Java pour cela:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
                    ...
                    final XPath xpath = XPATHFACTORY.newXPath();
    		String result = "";
    		final XPathExpression nodesXpath = xpath.compile(xpathQuery);
     
    		// Gets the element
    		final Element nd = 
    			(Element) nodesXpath.evaluate(doc, XPathConstants.NODE);
     
    		if (nd != null) {
    			result = nd.getTextContent();
    		}
                    ...

    Les valeurs obtenues sont les suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Value1: France
    Value2: Grèce

    Comment faire pour que la valeur "Grèce" soit correctement interprétée?

    J'ai déjà le fichier XML sous UTF-8 donc je ne vois pas d'où peut venir le problème...

    Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par pjmorce Voir le message
    Comment faire pour que la valeur "Grèce" soit correctement interprétée?
    #1 - Comment t'y prends-tu pour charger le fichier XML en question ? Es-tu sûr que tu laisses le parseur XML auto-détecter l'encodage correctement ?
    Tu lui fournis un File, un InputStream ou un Reader (ou un byte[] ou une String...) ?

    Normalement il faut lui fournir des octets et pas des caractères. Donc, un File, un byte[] ou un InputStream.
    Pas un Reader ni une String.

    #2 - Il est tout-à-fait possible que cette valeur soit correctement interprétée, et que le problème soit au moment où tu veux l'afficher ailleurs. Vérifie si ce n'est pas ça. (Genre, au lieu d'afficher un truc qui est extrait de ton XML, affiche carrément une String avec des accents, genre "Grèce".)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut
    Merci pour ta réponse.

    J'ai fais un debug et mon problème se trouve bien au moment du chargement de l'XML je pense car je sauvegarde le contenu du XML dans une String.

    Je vais voir comment faire pour obtenir mon Document XML à partir d'un inputstream...

    Citation Envoyé par thelvin Voir le message
    #1 - Comment t'y prends-tu pour charger le fichier XML en question ? Es-tu sûr que tu laisses le parseur XML auto-détecter l'encodage correctement ?
    Tu lui fournis un File, un InputStream ou un Reader (ou un byte[] ou une String...) ?

    Normalement il faut lui fournir des octets et pas des caractères. Donc, un File, un byte[] ou un InputStream.
    Pas un Reader ni une String.

    #2 - Il est tout-à-fait possible que cette valeur soit correctement interprétée, et que le problème soit au moment où tu veux l'afficher ailleurs. Vérifie si ce n'est pas ça. (Genre, au lieu d'afficher un truc qui est extrait de ton XML, affiche carrément une String avec des accents, genre "Grèce".)

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut Précisions du langage dans les balises CODE
    ReBonjour

    J'ai modifié mon code et maintenant mon objet Document est bien obtenu à partir d'un File.


    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       final DocumentBuilder docBuilder = DocumentUtil.getNewDocumentBuilder();
       final Document doc = docBuilder.parse(new File(filename))



    Cependant, mon problème d'encodage persiste.

    Dans ma méthode je parcours le Document pour obtenir les différentes valeurs et à partir de ces valeurs je veux créer un XSL. Voici une partie du code simplifiée pour mieux comprendre:


    Code java : 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
    final ByteArrayOutputStream myXmlOutputStream = new ByteArrayOutputStream();
     
    final XMLStreamWriter mywriter = XMLOutputFactory.newInstance().createXMLStreamWriter(xmlOutputStream);
     
    ...
     
     
    final String value = getValue(Element);
     
    mywriter.writeCharacters(name);
    mywriter.writeCharacters(value);
    mywriter.writeEndElement();
     
    ...
     
    java.io.OutputStream outputStream = new java.io.FileOutputStream ("d:/resultat.xslt");
    myXmlOutputStream.writeTo(outputStream);
    outputStream.close();


    En faisant "debug" la valeur des "value" obtenues est correcte (les charactères spéciaux sont bien affichés.
    Mais le XSL généré dans le fichier resultat.xslt n'est pas correct. Les charactères spéciaux n'apparaissent pas correctement...
    Exemple:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times">
    	<xsl:template match="/">
    		...
    		<VALUE1>France</VALUE1>
    		<VALUE2>France</VALUE2>
    		...
    	</xsl:template>
    </xsl:stylesheet>


    Une idée de comment corriger le problème?

    Merci

    Citation Envoyé par pjmorce Voir le message
    Merci pour ta réponse.

    J'ai fais un debug et mon problème se trouve bien au moment du chargement de l'XML je pense car je sauvegarde le contenu du XML dans une String.

    Je vais voir comment faire pour obtenir mon Document XML à partir d'un inputstream...

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hum. Je ne me suis jamais servi de XMLStreamWriter. Mais bon.

    Citation Envoyé par pjmorce Voir le message
    RMais le XSL généré dans le fichier resultat.xslt n'est pas correct. Les charactères spéciaux n'apparaissent pas correctement...
    En es-tu sûr ? Comment vérifies-tu ?

    - D'abord, ton exemple ne le montre pas : il ne contient pas de caractère spécial ni rien qui s'affiche mal.
    - Si ça se trouve, le fichier construit est très bien, c'est juste que toi tu l'ouvres en iso-8859-1 alors que c'est un fichier utf-8. Peux-tu vérifier ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut
    Oui...

    Par contre, je me suis mal exprimé en écrivant. Les caractères accentués sont correctement affichés dans le fichier XSL généré mais pas les "<" et les ">" (dans le cas où la valeur du tag "value" contient des "<" et des ">").

    Par exemple, mon fichier XML source possède ceci:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
       ...
       <variable>
          <value>France</value>
       </variable>
       <variable>
          <value>Grèce</value>
       </variable>
       <variable>
          <value><xsl:variable name="Genre" select="client/nom"/></value>
       </variable>
       ...
    </xml>



    Voici l'aspect de mon XSL généré:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times">
    	<xsl:template match="/">
    		<root>
    			<VALUE1>France</VALUE1>
    			<VALUE2>Grèce</VALUE2>
    			<VALUE3>&lt;xsl:variable name="Pays" select="root/column_8"/&gt;</VALUE3>
    		</root>
    	</xsl:template>
    </xsl:stylesheet>



    Voilà. Les charactères spéciaux sont interprétés mais pas les "<" / ">"...

    Je ne sais pas quel est le problème...


    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times">
    	<xsl:template match="/">
    		...
    		<VALUE1>France</VALUE1>
    		<VALUE2>France</VALUE2>
    		...
    	</xsl:template>
    </xsl:stylesheet>

    Citation Envoyé par thelvin Voir le message
    Hum. Je ne me suis jamais servi de XMLStreamWriter. Mais bon.



    En es-tu sûr ? Comment vérifies-tu ?

    - D'abord, ton exemple ne le montre pas : il ne contient pas de caractère spécial ni rien qui s'affiche mal.
    - Si ça se trouve, le fichier construit est très bien, c'est juste que toi tu l'ouvres en iso-8859-1 alors que c'est un fichier utf-8. Peux-tu vérifier ?

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Vraiment ? Je trouve ça très difficile à croire.

    Tu dis que la valeur en question, lue à partir du fichier XML, est lue en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final String value = getValue(Element);
    C'est bien ça ? Est-ce qu'on peut voir cette fameuse méthode getValue() ? Si ce que tu dis est vrai, elle fait des choses vraiment horribles.


    Au fait, pour transmettre des balises d'un fichier à un autre, tu ne peux pas utiliser une String, il faut garder les objets sous leur forme XML : Text et Element, peut-être dans une List ou bien simplement conserver l'Element qui les contient.

    Et il n'est pas vraiment possible de passer par XMLStreamWriter. Il vaut mieux charger le DOM du document lu, fabriquer un DOM du document à écrire, dans lequel on peut import des éléments du DOM lu, et sérialier le DOM construit pour écrire le fichier.


    Exemple, en JDOM :

    fichier à lire : variables.xml :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <variables xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <variable>
        <value>France</value>
      </variable>
      <variable>
        <value>Grèce</value>
      </variable>
      <variable>
        <value><xsl:variable name="Genre" select="client/nom"/></value>
      </variable>
    </variables>

    Fichier template.xsl qui définit grosso-modo la feuille de style et qui sert de base pour créer la feuille de style finale, dans laquelle on a inséré les variables :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times">
      <xsl:template match="/">
        <root/>
      </xsl:template>
    </xsl:stylesheet>

    Et voici le code qui crée le fichier transform.xsl à partir de variables.xml et template.xsl :

    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
    public class MakeXml {
     
      public static void main(String[] args) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document varDoc = builder.build(new File("variables.xml"));
        Document xsltDoc = builder.build(new File("template.xsl"));
     
        // Choper toutes les valeurs du doc source
        @SuppressWarnings("unchecked")
        List<Element> variables = XPath.selectNodes(varDoc, "/variables/variable/value");
     
        // Choper l'élément à remplir dans la XSLT
        Element templateRoot = (Element)XPath.selectSingleNode(xsltDoc, "//root");
     
        int i = 1;
        for(Element variable : variables) {
        	variable.detach(); // retirer du doc source
        	variable.setName("VALUE" + i);
            templateRoot.addContent(variable); // ajouter au doc construit
     
        	i++;
        }
     
        new XMLOutputter().output(xsltDoc, new FileOutputStream("transform.xsl"));
      }
     
    }
    Ça reste assez simple. Il faut utiliser les bibliothèques JDOM et Jaxen, pour ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut
    Bonjour

    Merci pour ta réponse.

    Ma méthode getValue(), exécute une query XPath afin de retourner la valeur qui se trouve dans un certain element:


    final String qR = XpathQuery.genericQueryString(
    "variable/value",
    xmlDoc);
    Donc, pour l'XML exemple, j'obtiens quelque chose du genre "France", "Grèce", etc.

    Comme je l'ai dit, dans la balise value il peut y avoit des expressions XSLs.
    Il me faut que la valeur retournée soit dans une string car je doit la manipuler pour valider si elle contient une chaine de caracteres et la remplacer par une autre.

    Je vais construire un programme Java plus simple pour essayer de reproduire et isoler le problème et trouver la cause/solution.

    Merci!

    Citation Envoyé par thelvin Voir le message
    Vraiment ? Je trouve ça très difficile à croire.

    Tu dis que la valeur en question, lue à partir du fichier XML, est lue en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final String value = getValue(Element);
    C'est bien ça ? Est-ce qu'on peut voir cette fameuse méthode getValue() ? Si ce que tu dis est vrai, elle fait des choses vraiment horribles.


    Au fait, pour transmettre des balises d'un fichier à un autre, tu ne peux pas utiliser une String, il faut garder les objets sous leur forme XML : Text et Element, peut-être dans une List ou bien simplement conserver l'Element qui les contient.

    Et il n'est pas vraiment possible de passer par XMLStreamWriter. Il vaut mieux charger le DOM du document lu, fabriquer un DOM du document à écrire, dans lequel on peut import des éléments du DOM lu, et sérialier le DOM construit pour écrire le fichier.


    Exemple, en JDOM :

    fichier à lire : variables.xml :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <variables xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <variable>
        <value>France</value>
      </variable>
      <variable>
        <value>Grèce</value>
      </variable>
      <variable>
        <value><xsl:variable name="Genre" select="client/nom"/></value>
      </variable>
    </variables>

    Fichier template.xsl qui définit grosso-modo la feuille de style et qui sert de base pour créer la feuille de style finale, dans laquelle on a inséré les variables :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times">
      <xsl:template match="/">
        <root/>
      </xsl:template>
    </xsl:stylesheet>

    Et voici le code qui crée le fichier transform.xsl à partir de variables.xml et template.xsl :

    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
    public class MakeXml {
     
      public static void main(String[] args) throws Exception {
        SAXBuilder builder = new SAXBuilder();
        Document varDoc = builder.build(new File("variables.xml"));
        Document xsltDoc = builder.build(new File("template.xsl"));
     
        // Choper toutes les valeurs du doc source
        @SuppressWarnings("unchecked")
        List<Element> variables = XPath.selectNodes(varDoc, "/variables/variable/value");
     
        // Choper l'élément à remplir dans la XSLT
        Element templateRoot = (Element)XPath.selectSingleNode(xsltDoc, "//root");
     
        int i = 1;
        for(Element variable : variables) {
        	variable.detach(); // retirer du doc source
        	variable.setName("VALUE" + i);
            templateRoot.addContent(variable); // ajouter au doc construit
     
        	i++;
        }
     
        new XMLOutputter().output(xsltDoc, new FileOutputStream("transform.xsl"));
      }
     
    }
    Ça reste assez simple. Il faut utiliser les bibliothèques JDOM et Jaxen, pour ça.

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par pjmorce Voir le message
    Ma méthode getValue(), exécute une query XPath afin de retourner la valeur qui se trouve dans un certain element:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    final String qR = XpathQuery.genericQueryString(
    "variable/value",
    xmlDoc);
    Donc, pour l'XML exemple, j'obtiens quelque chose du genre "France", "Grèce", etc.
    Oui, mais cela ne peut pas possiblement transformer

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="Genre" select="client/nom"/>

    en

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    &lt;xsl:variable name="Genre" select="client/nom"/&gt;

    comme tu l'as dit dans ton précédent message.
    Ça le transformerait en chaîne vide et c'est tout.

    Donc ou bien tu as menti dans ton précédent message, ou bien cette méthode fait autre chose que ça.

    Citation Envoyé par pjmorce Voir le message
    Comme je l'ai dit, dans la balise value il peut y avoit des expressions XSLs.
    Il me faut que la valeur retournée soit dans une string car je doit la manipuler pour valider si elle contient une chaine de caracteres et la remplacer par une autre.
    Les balises sont des balises, les String sont des Strings. C'est ainsi et ce n'est pas autrement. C'est inutile de souhaiter autre chose.
    De toute façon, tu ne peux pas remplacer arbitrairement une String qui contient une balise, le résultat serait mal formé. Ce n'est donc pas spécialement un problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut
    Voilà,

    J'ai fait un petit programme pour isoler le problème.

    J'ai ma classe qui charge un XML et à partir de cet XML génère un XSL.

    Voici la classe:

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.IOException;
     
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.stream.XMLOutputFactory;
    import javax.xml.stream.XMLStreamWriter;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathExpression;
    import javax.xml.xpath.XPathExpressionException;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
     
     
    public class Tst {
     
     
    	/**
             * 
             * @param args
             */
    	public static void main(String[] args) {
    		System.out.println("begin");
     
    		try {
    			final String sic = "tst.xml";
     
    			final Document ic = 
    				DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(sic));
    			final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    			final XMLStreamWriter mywriter = 
    				XMLOutputFactory.newInstance().createXMLStreamWriter(baos);
     
    			mywriter.writeStartElement("xsl:stylesheet");
    			mywriter.writeAttribute("version", "2.0");
    			mywriter.writeAttribute("xmlns:xsl",
    					"http://www.w3.org/1999/XSL/Transform");
    			mywriter.writeAttribute("xmlns:date", 
    				"http://exslt.org/dates-and-times");
    			mywriter.writeStartElement("xsl:template");
    			mywriter.writeAttribute("match", "/");
    			mywriter.writeStartElement("Root");
    			mywriter.writeStartElement("Vals");
     
    			String city = evaluateXpath(
    					"countries/var[@variable_name='EXP_CITY']/query", 
    					ic);
    			city = city.replaceFirst("\\[INDEX\\]", "0");
    			mywriter.writeStartElement("EXP_CITY");
    			mywriter.writeCharacters(city);
    			mywriter.writeEndElement();
     
    			final String qR = 
    				evaluateXpath(
    					"countries/var[@variable_name='EXP_COUNTRY']/query", 
    					ic);
    			mywriter.writeStartElement("EXP_COUNTRY");
    			mywriter.writeCharacters(qR);
    			mywriter.writeEndElement();
     
    			mywriter.writeEndElement();
    			mywriter.writeEndElement();
     
    			mywriter.writeEndElement();
    			mywriter.writeEndElement();
    			mywriter.flush();
    			mywriter.close();
     
    			java.io.OutputStream outputStream = 
    				new java.io.FileOutputStream ("d:/res.xslt");
    			baos.writeTo(outputStream);
    			outputStream.close();
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
     
    		System.out.println("end");
    	}
     
     
    	private static synchronized String evaluateXpath(
    			final String xpathQuery, final Document doc) 
    		throws IOException, XPathExpressionException {
     
    		final XPath xpath = org.apache.xpath.jaxp.XPathFactoryImpl.newInstance().newXPath();
    		String result = "";
    		final XPathExpression nodesXpath = xpath.compile(xpathQuery);
     
    		// Gets the element
    		final Element nd = 
    			(Element) nodesXpath.evaluate(doc, XPathConstants.NODE);
     
    		if (nd != null) {
    			result = nd.getTextContent();
    		}
     
    		return result;
    	}
     
    }

    Le résultat est le fichier res.xslt et son contenu est le suivant:

    Code xml : 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
     
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times"><xsl:template match="/"><Root><Vals><EXP_CITY>
    			&lt;xsl:value-of select="Root/column_0"/&gt;
    		</EXP_CITY><EXP_COUNTRY>
    			&lt;xsl:variable name="Pays" select="Root/column_1"/&gt;
    			&lt;xsl:choose&gt;
    				&lt;xsl:when test="$Pays = 'Portugal'"&gt;PT&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Luxembourg'"&gt;L&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Italie'"&gt;IT&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Grèce'"&gt;GR&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Grande-Bretagne'"&gt;GB&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Finlande'"&gt;FIN&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Espagne'"&gt;ES&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Slovaquie'"&gt;SK&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Suède'"&gt;SE&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Roumanie'"&gt;RO&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Pologne'"&gt;PL&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Pays-Bas'"&gt;NL&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Hongrie'"&gt;HU&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'République Tchèque'"&gt;CZ&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Suisse'"&gt;CH&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Bulgarie'"&gt;BG&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Autriche'"&gt;AT&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'France'"&gt;F&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Allemagne (République fédérale)'"&gt;D&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Allemagne (ancienne République démocratique)'"&gt;DDR&lt;/xsl:when&gt;
    				&lt;xsl:when test="$Pays = 'Belgique'"&gt;B&lt;/xsl:when&gt;
    			&lt;/xsl:choose&gt;
    		</EXP_COUNTRY></Vals></Root></xsl:template></xsl:stylesheet>


    Le résultat est celui que je veux à part les "<" et ">" des XSLs qui ne sont pas correctement interprétés.

    Quand je fais un "evaluateXPath", je veux obtenir une String de façon à ce que je puisse faire le "replaceFirst"...

    Enfin, je pense avoir isoler et simplifier mon problème...

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Manque le fichier tst.xml. Je sens qu'il contient du <![CDATA[ ... ]]> et j'ai du mal à comprendre pourquoi ça n'a toujours pas été dit.

    Et il faut utiliser [CODE], pas [QUOTE]
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 401
    Par défaut
    Voila le fichier XML. Je l'avais pas envoyé pour ne pas créer encore plus de confusion. L'effet a été le contraire... désolé.

    Code xml : 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
    37
    38
    39
    40
     
    <?xml version="1.0" encoding="UTF-8"?>
    <countries>
     
    	<var variable_name="EXP_CITY">
    		<query><![CDATA[
    			<xsl:value-of select="Root/column_[INDEX]"/>]]>
    		</query>
    	</var>
     
    	<var variable_name="EXP_COUNTRY">
    		<query><![CDATA[
    			<xsl:variable name="Pays" select="Root/column_1"/>
    			<xsl:choose>
    				<xsl:when test="$Pays = 'Portugal'">PT</xsl:when>
    				<xsl:when test="$Pays = 'Luxembourg'">L</xsl:when>
    				<xsl:when test="$Pays = 'Italie'">IT</xsl:when>
    				<xsl:when test="$Pays = 'Grèce'">GR</xsl:when>
    				<xsl:when test="$Pays = 'Grande-Bretagne'">GB</xsl:when>
    				<xsl:when test="$Pays = 'Finlande'">FIN</xsl:when>
    				<xsl:when test="$Pays = 'Espagne'">ES</xsl:when>
    				<xsl:when test="$Pays = 'Slovaquie'">SK</xsl:when>
    				<xsl:when test="$Pays = 'Suède'">SE</xsl:when>
    				<xsl:when test="$Pays = 'Roumanie'">RO</xsl:when>
    				<xsl:when test="$Pays = 'Pologne'">PL</xsl:when>
    				<xsl:when test="$Pays = 'Pays-Bas'">NL</xsl:when>
    				<xsl:when test="$Pays = 'Hongrie'">HU</xsl:when>
    				<xsl:when test="$Pays = 'République Tchèque'">CZ</xsl:when>
    				<xsl:when test="$Pays = 'Suisse'">CH</xsl:when>
    				<xsl:when test="$Pays = 'Bulgarie'">BG</xsl:when>
    				<xsl:when test="$Pays = 'Autriche'">AT</xsl:when>
    				<xsl:when test="$Pays = 'France'">F</xsl:when>
    				<xsl:when test="$Pays = 'Allemagne (République fédérale)'">D</xsl:when>
    				<xsl:when test="$Pays = 'Allemagne (ancienne République démocratique)'">DDR</xsl:when>
    				<xsl:when test="$Pays = 'Belgique'">B</xsl:when>
    			</xsl:choose>
    		]]></query>
    	</var>
     
    </countries>

    Citation Envoyé par thelvin Voir le message
    Manque le fichier tst.xml. Je sens qu'il contient du <![CDATA[ ... ]]> et j'ai du mal à comprendre pourquoi ça n'a toujours pas été dit.

    Et il faut utiliser [CODE], pas [ QUOTE]

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Remarquons, je comprends que tout le monde me croit les habitués capables de lire les pensées : mes propres prévisions sont correctes 4 fois sur 5.
    Donc, tout cela était possible du fait des <![CDATA[ ... ]>>

    Les CDATA sont du texte. Ce texte, en dehors de CDATA, représenterais des balises.
    Donc, le but est de sélectionner ce texte dans le fichier source, de le transformer en balises, et de l'insérer dans le fichier destination.

    La lecture est chiante à faire, l'écriture est chiante à faire. Youpi. Les choses auraient été plus simples sans ces CDATA.

    Honnêtement je sais pas ce qui est le plus simple pour se sortir de ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Voilà ce que je peux proposer de plus simple, avec les bibliothèques JDOM et Jaxen :

    fichier template.xslt :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0"
      xmlns:date="http://exslt.org/dates-and-times"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
      <xsl:template match="/">
      	<Root>
      		<Vals>
      			<EXP_CITY/>
      			<EXP_COUNTRY/>
      		</Vals>
      	</Root>
      </xsl:template>
    </xsl:stylesheet>

    Programme d'exemple :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    public class Tst {
     
      private static final String WRAPPER_DOC =
        "<root xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>%s</root>";
     
      private static Element selectXPathElement(Document document, String xpath) throws JDOMException {
    	  return (Element)XPath.selectSingleNode(document, xpath);
      }
     
      private static String selectXPathString(Document document, String xpath) throws JDOMException {
    	  return selectXPathElement(document, xpath).getValue();
      }
     
      private static List<Content> toDomContent(String xml) throws JDOMException, IOException {
        SAXBuilder builder = new SAXBuilder();
        String sDocument = String.format(WRAPPER_DOC, xml);
        Document document = builder.build(new StringReader(sDocument));
        @SuppressWarnings("unchecked")
        List<Content> content = document.getRootElement().getContent();
        // set free of its owner document so that another document can adopt it
        content = new ArrayList<Content>(content);
        for(Content child : content) {
          child.detach();
        }
        return content;
      }
     
      private static void insertContent(Document document, List<Content> content, String xpath) throws JDOMException {
    	  Element element = selectXPathElement(document, xpath);
    	  element.addContent(content);
      }
     
      public static void main(String[] args) {
        System.out.println("begin");
     
        try {
          final String sic = "tst.xml";
          final String sXsltDoc = "template.xslt";
     
          SAXBuilder builder = new SAXBuilder();
     
          Document inDoc = builder.build(new File(sic));
          Document xsltDoc = builder.build(new File(sXsltDoc));
     
          String sCity = selectXPathString(inDoc, "/countries/var[@variable_name='EXP_CITY']/query");
          sCity = sCity.replaceFirst("\\[INDEX\\]", "0");
          List<Content> cityContent = toDomContent(sCity);
     
          insertContent(xsltDoc, cityContent, "//EXP_CITY");
     
          String sQr = selectXPathString(inDoc, "/countries/var[@variable_name='EXP_COUNTRY']/query");
          List<Content> qrContent = toDomContent(sQr);
     
          insertContent(xsltDoc, qrContent, "//EXP_COUNTRY");
     
          new XMLOutputter().output(xsltDoc, new FileOutputStream("d:/res.xslt"));
     
        } catch (Exception e) {
          e.printStackTrace();
        }
     
        System.out.println("end");
      }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème encodage de certains caractères
    Par marieR dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/12/2006, 15h55
  2. Réponses: 4
    Dernier message: 28/09/2006, 20h20
  3. [DOM] Problème encodage
    Par spilliaert dans le forum Format d'échange (XML, JSON...)
    Réponses: 19
    Dernier message: 05/06/2006, 16h26
  4. Probléme encodage caractéres spéciaux MYSQL
    Par FoxLeRenard dans le forum Installation
    Réponses: 1
    Dernier message: 20/02/2006, 12h10
  5. Réponses: 1
    Dernier message: 02/02/2006, 23h12

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