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 :

Sous arbre et formatage de sortie conditionnel [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut Sous arbre et formatage de sortie conditionnel
    Bonjour,

    Je suis confronté à un problème que je ne parviens pas encore à résoudre.

    Voilà, j'ai un XML comme ceci :
    Code : 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"?>
    <racine xmlns="uri1" xmlns:xsi="uri2">
      <aaa>
        <bbb>BBBBB</bbb>
      </aaa>
      <ccc>
        <ddd>DDDDD</ddd>
      </ccc>
      <ddd>
        <data>
    ...
        </data>
      </ddd>
    </racine>
    La balise <data> peut contenir soit un sous arbre XML, soit du texte formaté.

    Mon premier problème consiste à extraire le contenu de cette balise <data>.
    Mon second, à ajouter ou non la déclaration <?xml?> dans le résultat selon que son contenu soit du XML ou du texte.

    Voici les 2 fichiers 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
    <?xml version="1.0" encoding="UTF-8"?>
    <racine xmlns="uri1" xmlns:xsi="uri2">
      <aaa>
        <bbb>BBBBB</bbb>
      </aaa>
      <ccc>
        <ddd>DDDDD</ddd>
      </ccc>
      <ddd>
        <data>
    ligne11111111111111111111111
    ligne22222222222222222222222
    ligne33333333333333333333333
        </data>
      </ddd>
    </racine>
    et

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <racine xmlns="uri1" xmlns:xsi="uri2">
      <aaa>
        <bbb>BBBBB</bbb>
      </aaa>
      <ccc>
        <ddd>DDDDD</ddd>
      </ccc>
      <ddd>
        <data>
          <ppp xmlns="uri3">
            <sss>
              <qqq>QQQQQQQQ</qqq>
              <rrr>RRRRRRRR</rrr>
            </sss>
          </ppp>
        </data>
      </ddd>
    </racine>
    Et mon script XSLT qui ne fonctionne que dans le cas texte, et encore !
    Car il me laisse des espaces au début !!!!!
    Et aussi ne fonctionne pas si <data> contient du XML.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:x="uri1">
      <xsl:output method="text" omit-xml-declaration="yes" encoding="utf-8" />
      <xsl:strip-space elements="*" />
      <xsl:template match="/">
        <xsl:apply-templates select="/x:racine/x:ddd/x:data" />
      </xsl:template>
      <xsl:template match="*">
        <xsl:copy-of select="." />
      </xsl:template>
    </xsl:stylesheet>
    comme on le voit ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ligne11111111111111111111111
    ligne22222222222222222222222
    ligne33333333333333333333333
    Merci pour votre aide.

  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 domiq44 Voir le message
    Mon second, à ajouter ou non la déclaration <?xml?> dans le résultat selon que son contenu soit du XML ou du texte.
    On ne peut pas. Une transformation XSLT produit soit toujours du texte, soit toujours du XML, soit toujours du HTML.
    (Et avec le XML, elle produit une déclaration XML soit toujours, soit jamais.)

    Il te faut une couche au-dessus pour déterminer d'abord si tu prends la XSLT qui produit du texte ou celle qui produit du XML.
    (Autre possibilité : produire toujours du texte, et si nécessaire générer soi-même les balises et la déclaration XML sous forme de texte. Mais c'est un bricolage.)

    Citation Envoyé par domiq44 Voir le message
    Et mon script XSLT qui ne fonctionne que dans le cas texte, et encore !
    Car il me laisse des espaces au début !!!!!
    C'est parce que XSLT traite aussi l'indentation qu'il y a dans tes fichiers XML source. Après tout ce n'est que du texte normal.

    Il suffit de l'annuler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:template match="text()">
      <!-- et là on fait rien, donc l'indentation ne sera plus traitée et donc disparaîtra -->
    </xsl:template>
    Edit : Il y a aussi le fait qu'il y a un retour à la ligne entre ta balise <data> et la première ligne. Si tu copies l'élément, tu vas aussi copier cette fin de ligne, normal.
    Pour l'éviter, il faut ne pas copier le premier caractère (la fin de ligne, donc,) de cette balise.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Merci thelvin

    Citation Envoyé par thelvin Voir le message
    On ne peut pas. Une transformation XSLT produit soit toujours du texte, soit toujours du XML, soit toujours du HTML.
    (Et avec le XML, elle produit une déclaration XML soit toujours, soit jamais.)
    Ok. Je comprends.

    Citation Envoyé par thelvin Voir le message
    Il te faut une couche au-dessus pour déterminer d'abord si tu prends la XSLT qui produit du texte ou celle qui produit du XML.
    (Autre possibilité : produire toujours du texte, et si nécessaire générer soi-même les balises et la déclaration XML sous forme de texte. Mais c'est un bricolage.)
    Je préfère la 2ème solution, car elle me semble plus facile à mettre en oeuvre.
    Je regarderai ça lorsque mon 1er problème sera résolu.

    Citation Envoyé par thelvin Voir le message
    C'est parce que XSLT traite aussi l'indentation qu'il y a dans tes fichiers XML source. Après tout ce n'est que du texte normal.

    Il suffit de l'annuler
    Je viens d'essayer mais ça n'a eu l'air de fonctionner !
    J'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:x="uri1">
      <xsl:output method="text" omit-xml-declaration="yes" encoding="utf-8" />
      <xsl:strip-space elements="*" />
      <xsl:template match="/">
        <xsl:apply-templates select="/x:racine/x:ddd/x:data" />
      </xsl:template>
      <xsl:template match="text()">
        <xsl:copy-of select="." />
      </xsl:template>
    </xsl:stylesheet>
    Ce n'est pas ça ?

  4. #4
    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 domiq44 Voir le message
    Ce n'est pas ça ?
    Euh ? Non...

    Là tu indiques très clairement de copier tous les nœuds textes parcourus.
    Il se trouve que c'est déjà ce qui se fait par défaut. Moi je t'ai dit de ne pas les copier. Puisque ça inclut les indentation et que tu ne veux pas les indentations.

    Pour inclure quand même le contenu de <data>, ben <xsl:copy-of> sur <data> n'était pas mal.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Excuse moi thelvin, je ne t'avais pas compris

    Je viens d'essayer ça, mais ça ne marche toujours pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:x="uri1">
      <xsl:output method="text" omit-xml-declaration="yes" encoding="utf-8" />
      <xsl:strip-space elements="*" />
      <xsl:template match="/">
        <xsl:copy-of select="/x:racine/x:ddd/x:data" />
      </xsl:template>
      <xsl:template match="text()">
        <!-- et là on fait rien, donc l'indentation ne sera plus traitée et donc disparaîtra -->
      </xsl:template>
    </xsl:stylesheet>

  6. #6
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Si ça marche
    Mes excuses thelvin

    Le problème est que les données contenues dans la balise <data> contiennent une ligne blanche avant et après.

    Existe-t-il un moyen de faire l'équivalent d'un trim(), c'est-à-dire d'éliminer les espaces en début et en fin de données ?

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/02/2015, 19h37
  2. stockage de sous arbres
    Par yarf dans le forum Langage
    Réponses: 1
    Dernier message: 22/08/2006, 22h03
  3. [JDOM] Déplacer un sous arbre d'un fichier xml vers un autre
    Par LannionJava dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 21/07/2006, 15h51
  4. [DTD] Comment définir un sous-arbre variable?
    Par heffer69 dans le forum Valider
    Réponses: 3
    Dernier message: 25/06/2006, 10h34
  5. [Arbre XMl] Extraction d'un sous arbre
    Par tipaquo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/06/2005, 12h34

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