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

XSL/XSLT/XPATH XML Discussion :

XSL, changer le format d un ficher xml


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut XSL, changer le format d un ficher xml
    Bonjour à tous,

    J'ai un problème assez simple que je n'arrive pas à résoudre.

    J'aimerais changer le formatting d'un fichier xml de la manière suivante.

    Mon fichier d'entrée xml serait par example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <A>
          <B attribute1="bla1" attribute2="bla2"/>
          <C attribute3="bla3" attrribute3="bla4"/>
    </A>
    Et j aimerais le transformer en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <A>
          <B 
                 attribute1="bla1" 
                 attribute2="bla2"
           />
          <C 
                 attribute3="bla3" 
                 attrribute3="bla4"
           />
    </A>
    en utilisant the xsl.

    J arrive a un result plus ou moins proche en utilisant le code suivant :

    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
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
     
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
     
    <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates/>
    	<xsl:for-each select="@*">
        	<xsl:value-of select="name()"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
    </xsl:text>
        </xsl:for-each>
    </xsl:copy>
    </xsl:template>
     
    </xsl:stylesheet>

    Mais l indentation et les espace ne donne pas bien

    Je crois que je ne m'y prend pas de la bonne manière. si quelqu'un a un conseil c est volontier

    Un grand merci d'avance
    loic

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par duke9985 Voir le message
    en utilisant the xls.
    Déjà c'est xsl, et c'est vraiment pas le bon outil... Mais pour être honnête il n'y a pas de bon outil pour ça. Ce n'est pas quelque chose d'utile à faire.

    Si vraiment tu tiens à faire ça, il va falloir que tu programmes toi-même ton propre sérialiseur XML de sorte qu'il fasse cette indentation. Et le programmer en XSLT*me semble bien trop compliqué pour en valoir la peine. Plutôt se tourner vers JDOM Java ou un truc en C#.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Hello,

    merci pour ta réponse.

    Enfaite on aimerais faire ca pour être capable de lire facilement à l'oeil humain ces fichier xml (c est des fichier de configuration) Et j aimerais garder le meme format d'indentation pour etre capable de faire des diff dessus.

    Je vais jeter un coup d'oeil a JDOM, merci pour ta reponse

    loic

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par duke9985 Voir le message
    Enfaite on aimerais faire ca pour être capable de lire facilement à l'oeil humain ces fichier xml (c est des fichier de configuration)

    Et j aimerais garder le meme format d'indentation pour etre capable de faire des diff dessus.
    Ouais ben il est pas top ce format.
    Il aurait mieux valu un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <A>
      <B>
        <attribute1>bla1</attribute1>
        <attribute2>bla2</attribute2>
      </B> 
      <C> 
        <attribute3>bla3</attribute3>
        <attribute4>bla4</attribute4>
      </C> 
    </A>
    C'est lisible et c'est exactement comme ça que c'était prévu.

    Et encore, en fonction de la sémantique de ce format, il y a sûrement moyen d'améliorer.

    Citation Envoyé par duke9985 Voir le message
    Je vais jeter un coup d'oeil a JDOM, merci pour ta reponse
    Je recommande une modification de XMLOutputter, de ce genre :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class AttrIndentOutputter extends XMLOutputter {
     
      public static final String attrIndent;
     
      static {
        char[] spaces = new char[16];
        Arrays.fill(spaces, ' ');
        attrIndent = "\n" + new String(spaces);
      }
     
      protected void printAttributes(Writer out, List _attributes, Element parent,
        NamespaceStack namespaces) throws IOException {
     
        @SuppressWarnings("unchecked")
        List<Attribute> attributes = _attributes;
     
        for (Attribute attribute : attributes) {
          out.write(attrIndent);
          out.write(attribute.getName());
          out.write("=");
     
          out.write("\"");
          out.write(escapeAttributeEntities(attribute.getValue()));
          out.write("\"");
        }
      }
     
    }

    Pour un truc aussi simple, ce genre de solutions naïves suffit.

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta reponse.

    Actuellement on utilise le transformer de javax pour ecrir le fichier en xml. (on aimerais rester avec des librariies de la sdk)

    Le probleme typiquement avec le transformer et que si je modifie un fichier xml, toute l indentation devient bizarre et plus lisible a l oeil humaine.

    Est ce que je peux reimplementer ce transformer a la main ? Pour faire sortir le format que je veux ?

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Théoriquement c'est faisable, mais il faut l'implémenter entièrement : la bibli du JDK n'est pas extensible.
    Et sérialiser du XML n'est pas si facile que ça non plus.

    Raison pour laquelle je t'ai conseillé une approche plus pragmatique.

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ouais ben il est pas top ce format.
    Il aurait mieux valu un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <A>
      <B>
        <attribute1>bla1</attribute1>
        <attribute2>bla2</attribute2>
      </B> 
      <C> 
        <attribute3>bla3</attribute3>
        <attribute4>bla4</attribute4>
      </C> 
    </A>

    Quand j utilise le transformator de java. Je n obtien pas quelque chose comme ca. (qui irrait tres bien)

    J obtiens quelque chose de comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <A>
      <B attribute1="bla1" attribute2="bla2" />  
      <C attribute3="bla3" attribute4="bla4" />
    </A>
    Du coup c est vraiment illisible quand il y a beaucoup d attribut.

    J utilise le code suivant pour produire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TransformerFactory transFactory = TransformerFactory.newInstance();
    		Transformer transformer = transFactory.newTransformer();
    		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
         	transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
    		Source src = new DOMSource(xml);
    		Result dest = new StreamResult(out);
    		transformer.transform(src, dest);

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Ben oui, le transformateur fait son boulot. Si tu lui demandes de recopier un attribut, il va pas en faire un élément. C'est logique.
    Il aurait fallu que ce soit des éléments depuis le début, pour que le format soit correctement lisible.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ben oui, le transformateur fait son boulot. Si tu lui demandes de recopier un attribut, il va pas en faire un élément. C'est logique.
    Il aurait fallu que ce soit des éléments depuis le début, pour que le format soit correctement lisible.
    Oui pardon, je m embrouille. Mais denouveau tous me sattribut sont sur la meme ligne donc c est tres peux visible. je suis entrain d essayer le xmloutputter je te redirais le resultat

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Hello thelvin,

    Un grand merci pour ton aide.

    J'ai essaye le xml outputter ca marche parfaitement.

    Je suis entrain d etudier maintenant si je peux integrer le xml outputter a mon application existante (qui utilise le xml de javax) comme cela je n ai pas besoi nde trop modifie (plusieur miller de ligne de code)

    Merci encore

    loic

  11. #11
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Je suis entrain d etudier maintenant si je peux integrer le xml outputter a mon application existante (qui utilise le xml de javax) comme cela je n ai pas besoi nde trop modifie (plusieur miller de ligne de code)
    A priori :
    - faire la transformation dans un DOMResult et non pas un StreamResult.
    - une fois la transformation faite, appeler getNode() sur le DOMResult et le caster en Document.
    - passer de org.w3c.dom.Document à org.jdom.Document :
    -- construire un new DOMBuilder()
    -- appeler build() en lui passant le org.w3c.dom.Document. Le résultat est un org.jdom.Document
    - Utiliser une variante de XMLOutputter pour produire le résultat voulu.

Discussions similaires

  1. [XSL] Changer le nom d'une balise et d'un attribut XML
    Par castaka dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/10/2008, 20h33
  2. [XSLT] Choisir parmi plusieurs XSL pour un ficher XML
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 05/09/2006, 13h31
  3. [XSL]récupérer une valeur de plusieurs fichiers XML
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 05/02/2006, 01h32
  4. XSL ne parvient pas à lire les noeuds XML ??
    Par yahn dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/06/2004, 20h29
  5. [xsl] xsl juste pour faire copie d'un xml
    Par peppena dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/02/2004, 17h17

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