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 :

souci d'affichage d'une valeur en particulier [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut souci d'affichage d'une valeur en particulier
    Bonjour à tous,
    J'ai un problème d'affichage sur une valeur en particulier.
    Je souhaite transformer ma feuille XML (présente dans une session php) via xsl pour affichage
    Toutes les valeurs s'affichent correctement sauf 1, la liste des produits
    Voici le fichier XML simplifié au maximum :
    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
     
    <?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="result_en.xslt"?>
    <Clients>
        <Client>
            <Name>Nom</Name>
            <Street>Rue</Street>
            <ZipCode>Code postal</ZipCode>
            <City>Ville</City>
            <Country>Pays</Country>
            <HasSecondarySite>1</HasSecondarySite>
            <ActivityDomain>
                <ActivityDomainName>Domaine</ActivityDomainName>
            </ActivityDomain>
            <Service>
                <ServiceName>nom du service</ServiceName>
            </Service>
            <Prod>
                <pr>Produit 1</pr>
                <pr>Produit 2</pr>
            </Prod>
        </Client>
    </Clients>
    Ce fichier appelle donc un fichier xslt (result_en.xslt) dont voici le source
    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
     
    <?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" version="1.0" encoding="UTF-8" indent="yes"/>
        <xsl:template match="/">
            <html>
                <head>
                </head>
                <body>
                    <table>
                        <tr>
     
                            <td>Name</td>
                            <td>Address</td>
                            <td>Activity domain</td>
                            <td>service</td>
                            <td>Product Category</td>
                            <td>Sites</td>
                            <td>doc</td>
                        </tr>
     
                        <xsl:for-each select="//Client ">
     
                            <tr>
                                <xsl:choose>
                                    <xsl:when test="(position() mod 2) = 0">
                                        <xsl:attribute name="bgcolor">#ECE9D8</xsl:attribute>
                                    </xsl:when>
                                    <xsl:otherwise>
                                        <xsl:attribute name="bgcolor">#FFFFFF</xsl:attribute>
                                    </xsl:otherwise>
                                </xsl:choose>
     
                                <td>
                                    <xsl:value-of select="Name"/>
                                </td>
                                <td>
                                    <xsl:value-of select="Street"/>
                                    <xsl:text> </xsl:text>
                                    <xsl:value-of select="ZipCode"/>
                                    <xsl:text> </xsl:text>
                                    <xsl:value-of select="City"/>
                                </td>
                                <td>
                                    <xsl:value-of select="ActivityDomain/ActivityDomainName"/>
                                </td>
     
                                <td>
                                    <xsl:for-each select="Service ">
     
                                        <xsl:choose>
                                            <xsl:when test="substring(ServiceName,0, 3) = 'test1'">
                                                <xsl:value-of select="ServiceName"/>
                                            </xsl:when>
                                            <xsl:when test="substring(ServiceName,0, 4) = 'test2'">
                                                <xsl:value-of select="ServiceName"/>
                                                <br></br>
                                            </xsl:when>
                                        </xsl:choose>
     
                                        <br></br>
                                    </xsl:for-each>
                                </td>
                                <td>
                                    <xsl:for-each select="Prod/pr">
                                         <xsl:value-of select="."/>
                                    </xsl:for-each>
                                </td>
     
     
                                <xsl:if test="HasSecondarySite= '0' ">
                                    <td>No</td>
                                </xsl:if>
                                <xsl:if test="HasSecondarySite= '1' ">
                                    <td>Yes</td>
                                </xsl:if>
     
                                <td>
     
                                    <a href="">
                                        <xsl:text>Document</xsl:text>
                                    </a>
                                </td>
                            </tr>
     
                        </xsl:for-each>
                    </table>
     
                </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>
    Le problème vient donc de la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                                    <xsl:for-each select="Prod/pr">
                                         <xsl:value-of select="."/>
                                    </xsl:for-each>
    J'ai essayé select"current()", j'ai aussi essayé select=".", rien à faire....

  2. #2
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    En reprenant tel quel ton XML et ton XSL, ça fonctionne très bien chez moi.

    Il faudrait peut-être ajouter un <br/> après ton value-of pour que ce soit plus lisible (pareil pour Service et ActivityDomain d'ailleurs), mais sinon tout s'affiche.

    Qu'est-ce qui ne va pas de ton côté ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    Bonjour et merci pour la réponse aussi rapide.
    C'est bien le souci, si j'écris un fichier xml et utilise le xsl, ca passe sans souci.
    Mais le xml étant généré tout s'affiche mais pas les produits
    Pour ce code pas de souci, mais je me demande si je n'ai pas un caractère bizarre dans le code auto généré (ca fait 2 jours que je séche sur ce bout de code)

  4. #4
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Essaye de voir s'il n'y a pas une erreur d'encodage (fichier en ISO/ANSI avec des caractères UTF8 ou l'inverse). Tu peux voir ça avec Notepad++ sur le fichier généré par exemple (ou la commande file sous linux).

    Fais aussi attention à ce que, dans tes produits, tu n'aies pas de caractère "<" ou ">". Si c'est le cas, utilise du CDATA ou remplace-les par leur entité XML (&lt; ou &gt;).

    A part ça, je vois pas bien ce qui pourrait poser problème.
    A moins bien entendu que le code générant le fichier/flux XML soit foireux et ne renseigne pas les produits.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Le plus simple, en fait, ce serait de nous montrer un exemple qui a vraiment un problème, au lieu d'un exemple qui s'affiche parfaitement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    Bonjour
    En fait, le souci ce produit également avec ce XML....
    Je vais expliquer plus longuement le problème.
    Ce XML provient d'une session php, récupéré via une méthode d'un webservice.
    Si je copie colle ce résultat dans un fichier XML et que j'utilise la feuille XSL, pas de souci d'affichage...
    Par contre, si j'utilise le préprocesseur XSLT, tout s'affiche correctement sauf les produits....

  7. #7
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    A mon avis c'est ton code PHP qui est mauvais alors, je te conseille de poster dans le forum PHP.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    J'avais bien sur pensé au code PHP, mais celui-ci est relativement trivial

    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
     
     //Choix d'une feuille en fonction d'une langue...
            if ($lang == 'en-uk') {
                $XslData1 = "result_en.xslt";
            }
            else {
                $XslData1 = "result_fr.xslt";
            }
     
     
            //Chargement des classes pour xml et xslt
            $xsl_vue = new XSLTProcessor();
            $doc_vue = new DOMDocument();
     
            //Lecture du fichier xsl
            $doc_vue->load($XslData1);
            //Application du style
            $xsl_vue->importStyleSheet($doc_vue);
     
            //a la chaine xml
            $doc_vue->loadXML($_SESSION['vue']);
     
            //Affichage
            echo $xsl_vue->transformToXML($doc_vue);
    C'est du classique qui provient de php.net, donc je ne pense pas que le souci viennent de là.
    Surtout qu'il s'agit d'un souci d'affichage sur un élément particulier.
    Je pensais donc plus à un souci de balise avec le même nom ou autre (et que je n'aurai pas vu vu que je suis plongé dans le code, un regard extérieur des fois...)
    J'avoue que ça commence à me rendre chèvre ce problème

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    Le code paraît correct :

    J'ai juste remarqué que tu avais mis en blanc après Client, cela ne devrait pas jouer mais il vaux mieux ne pas en mettre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//Client ">
    Dans ton fichier XML source, il faudrait préciser l'encoding, je ne sais pas comment tu gères cela en PHP.

    Pour compléter ton étude, commence par lire le fichier sur disque pour voir, cela te donnera une idée si cela vient de ton encoding ou pas.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    J'ai légérement modifié le fichier XSL en remplaçant la partie non fonctionnelle par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      <xsl:for-each select="//Client/Prod">
                                         <xsl:value-of select="."/>
                                         <br></br>
                                    </xsl:for-each>
    En lieu et place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      <xsl:for-each select="//Client/Prod/pr">
                                         <xsl:value-of select="."/>
                                         <br></br>
                                    </xsl:for-each>
    Maintenant, j'affiche bien la liste des produits, mais avec la balise <pr>
    J'avais songé à remplacer cette balise par <br> pour faire un saut de ligne mais cette dernière apparait aussi dans le tableau !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    Citation Envoyé par abrillant Voir le message
    Bonjour,

    Le code paraît correct :

    J'ai juste remarqué que tu avais mis en blanc après Client, cela ne devrait pas jouer mais il vaux mieux ne pas en mettre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:for-each select="//Client ">
    Dans ton fichier XML source, il faudrait préciser l'encoding, je ne sais pas comment tu gères cela en PHP.

    Pour compléter ton étude, commence par lire le fichier sur disque pour voir, cela te donnera une idée si cela vient de ton encoding ou pas.
    Une précision, l'encodage est géré par le fichier XSL (UTF 8, pas de souci d'accent).
    Pour Client avec un espace, ca provient de la balise Client qui s'écrit <Client > et non <Client>.
    Pas de souci particulier en dehors du tag pr

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    Bonjour
    Au bout de quelques jours, j'ai trouvé tout seul, ma réécriture du xml via PHP était hasardeuse.... Le souci ne vient donc pas de la mais de la mauvaise méthode pour la réécriture !
    loceka avait donc bien raison !
    Merci à tous !

  13. #13
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Merci pour ton retour et content que tu aies pu résoudre ton problème.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/03/2006, 09h44
  2. [MySQL] Affichage d'une valeur de la bdd dans un input
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 23/02/2006, 12h28
  3. forcer l'affichage d'une valeur null
    Par sundjata dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/11/2005, 09h52
  4. [JDBC] Affichage d'une valeur de type CloB
    Par Jihed Amine Maaref dans le forum JDBC
    Réponses: 3
    Dernier message: 07/04/2005, 15h03
  5. Réponses: 13
    Dernier message: 24/02/2005, 16h45

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