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 :

Liaison d'éléments avec ID et IDREF


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Invité
    Invité(e)
    Par défaut Liaison d'éléments avec ID et IDREF
    Bonjour,

    Je viens vers vous avec un problème de xsl.
    Je vous mets la dtd, quelques données xml et mon code 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
    <!ELEMENT catalogue (plats,recettes,ingredients,compositions,listeAvis)>
     
    <!ELEMENT plats (plat+)>
    <!ELEMENT plat (nomPlat, typePlat)>
    <!ELEMENT nomPlat (#PCDATA)>
    <!ELEMENT typePlat (#PCDATA)>
    <!ATTLIST plat pk_idPlat ID #REQUIRED>
     
    <!ELEMENT recettes (recette+)>
    <!ELEMENT recette (nomRecette,sourceRecette,derouleRecette,tempsPrepa,difficulteRecette)>
    <!ELEMENT nomRecette (#PCDATA)>
    <!ELEMENT sourceRecette (#PCDATA)>
    <!ELEMENT derouleRecette (#PCDATA)>
    <!ELEMENT tempsPrepa (#PCDATA)>
    <!ELEMENT difficulteRecette (#PCDATA)>
    <!ATTLIST recette pk_idRecette ID #REQUIRED
    					fk_idPlat IDREF #IMPLIED>
    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
    <catalogue>
        <plats>
            <plat pk_idPlat="P01">
                <nomPlat>Crêpes</nomPlat>
                <typePlat>Dessert</typePlat>
            </plat>
        </plats>
     
    <recettes>
            <recette pk_idRecette="R01" fk_idPlat="P01">
                <nomRecette>Crêpes faciles et délicieuses</nomRecette>
                <sourceRecette>http://www.papillesetpupilles.fr/2011/01/crepes-faciles.html/</sourceRecette>
                <derouleRecette>Tamisez la farine dans un saladier. Ajoutez le sel, le sucre en 
                    poudre et le sucre vanillé puis les œufs et mélangez bien. Versez 
                    ensuite le lait petit à petit en mélangeant constamment pour éviter les 
                    grumeaux. Terminez en ajoutant le Cognac.
                    Pour la cuisson : A l’aide d’un papier essuie tout, huilez légèrement
                    votre poêle à crêpes. Faites la chauffer puis versez une petite louche 
                    de pâte sachant que plus vous mettez de pâte (dans des conditions 
                    raisonnables, on ne fait pas un pancake), donc plus vous mettez de pâte 
                    et plus elle sera moelleuse et moins vous en mettez et plus elle sera 
                    croustillante;
                    2 cuissons possible :
                    Soit vous laissez cuire environ 2 
                    minutes puis vous la retournez et laissez cuire 1 minute 
                    supplémentaire.{et si vous vous en sentez les capacités, vous la faites 
                    sauter }.Soit, au bout d’une à deux minutes de 
                    cuisson, saupoudrez-la d’une cuillère à soupe de sucre en poudre, 
                    pliez-la en 4 (comme sur la photo) et laissez chauffer quelques secondes
                    le temps que le sucre soit fondu. Servez immédiatement. La crêpe n’est 
                    ainsi cuite que d’un seul côté et mi-cuite pourrait-on dire de l’autre. 
                    Nous ne les mangeons quasiment que comme cela à la maison.</derouleRecette>
                <tempsPrepa>15 minutes</tempsPrepa>
                <difficulteRecette>Facile</difficulteRecette>
            </recette></recettes>
    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
    <body>
                <header>
                    <img>
                        <xsl:attribute name="src">
                            <xsl:value-of select="image/image.png"/>
                        </xsl:attribute>
                    </img>
                </header>
                <h1>Dessert</h1>
                <div class="crepe">
                    <h2>Recettes de crêpes</h2>
     
                    <!-- affichage du nomRecette si nomPlat = Crêpes-->
                    <xsl:for-each select="recettes/recette"> 
                     <xsl:variable name="plat" select="@fk_idPlat"/> 
                      <xsl:for-each select="plats/plat[@pk_idPlat=$plat]"> 
                            <xsl:value-of select="nomRecette"/>
                     </xsl:for-each>  
                    </xsl:for-each>
                </div>
            </body>
    Ce que j'aimerai c'est afficher le nom des recettes de crêpes. Le lien entre les deux entité se fait grâce au pk_idPlat et fk_idPlat.
    Donc ce qu'on veut c'est si la recette à un fk_idPlat=P01 alors on affiche le nomRecette (on en a 5 avec un fk_idPlat=P01 donc logiquement il nous fait une liste de cinq nomRecette différents)

    Merci pour votre aide, et n'hésitez pas à demander davantage d'informations.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Hello,

    Citation Envoyé par lucie62140 Voir le message
    Donc ce qu'on veut c'est si la recette à un fk_idPlat=P01 alors on affiche le nomRecette (on en a 5 avec un fk_idPlat=P01 donc logiquement il nous fait une liste de cinq nomRecette différents)
    Si. C'est un si. Pas un "pour chaque".

    Remplace par un simple <xsl:if> et les choses seront plus claires.

    Ça marche ? Bien.
    Pour information, voici ce qui n'allait pas avec le for-each. À chaque fois qu'on fait un for-each, à l'intérieur de ce for-each on change quel est l'élément en cours. ... Pour que l'élément en cours soit celui pour lequel tu es en train de faire une boucle -_-°. Donc avec un for-each sur plats/plat, ton élément en cours devient un <plat>, et ces éléments n'ont pas de <nomRecette>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Invité
    Invité(e)
    Par défaut
    Non, ça ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <!-- affichage si la recette à un fk_idPlat=P01 alors on affiche le nomRecettee -->
                    <xsl:for-each select="recettes/recette"> 
                        <li><xsl:if test="fk_idPlat='P01'"> 
                            <xsl:value-of select="nomRecette"/>
                        </xsl:if> </li>
                    </xsl:for-each>
    Le fk_idPlat est un IDREF et non pas un PCDATA, ça change peut être quelque chose ...

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    'Tention pas oublier le @

    Citation Envoyé par lucie62140 Voir le message
    Le fk_idPlat est un IDREF et non pas un PCDATA, ça change peut être quelque chose ...
    Nope.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai bien l'affichage d'une liste avec les puces mais rien à coté. Une liste vide donc alors que je devrais voir 5 nom de recettes correspondantes à mon if.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Chez moi ça marche... Si je mets ce qu'il faut pour compléter les bouts de code incomplets que tu nous as montrés.

    On peut voir à quoi ressemble ta version après correction, et sans enlever le code obligatoire pour qu'elle tourne ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Euh non, je n'irai pas sur ces sites -_-°.

    D'abord, tu devrais faire des fichiers assez petits pour que tu puisses simplement copier/coller leur contenu dans un message.
    Les trucs qui manquent dans ce que tu as déjà postés ne devraient pas faire plus de 7 lignes, alors la différence, hein.

    Ensuite, si vraiment tu veux échanger des fichiers, tu es pas obligée de le faire avec des sites pleins de pubs et de pop-ups. De mémoire il y a Dropbox, Google drive, Mega, et sûrement beaucoup d'autres.
    Comme tout le monde, j'ai autre chose à faire que naviguer dans cette horreur. Essaie de penser un peu aux autres, s'il te plaît. Je suis sûr que ce machin est très bien pour échanger des vidéos de vacances de plusieurs centaines de Mégaoctets, quand on a plus de place sur son Dropbox.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    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
    Je n'ai pas regardé les fichiers là non plus. Mais les usages de for-each dans le post-1 ne sont pas bons, déjà. En plus, il me semble qu'on cherche nomPlat plutot que nomRecette ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                   <!-- affichage du nomRecette si nomPlat = Crêpes-->
                    <xsl:for-each select="recettes/recette">    <!-- si ceci donne quelque chose, le contexte devrait être /catalogue -->
                     <xsl:variable name="plat" select="@fk_idPlat"/> 
                      <xsl:for-each select="/catalogue/plats/plat[@pk_idPlat=$plat]">     <!-- il faut redonner un xpath absolu -->
                            <xsl:value-of select="nomPlat"/>    <!-- sous plat, il y a nomPlat et non pas nomRecette -->
                     </xsl:for-each>  
                    </xsl:for-each>
    Si le document est préalablement validé on peut bien entendu l'optimizer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                   <!-- affichage du nomRecette si nomPlat = Crêpes-->
                    <xsl:for-each select="recettes/recette">    <!-- si ceci donne quelque chose, le contexte devrait être /catalogue -->
                     <xsl:variable name="plat" select="@fk_idPlat"/> 
                     <xsl:value-of select="/catalogue/plats/plat[@pk_idPlat=$plat]/nomPlat"/>>
                    </xsl:for-each>
    Même si c'est pas préalablement validé, ça donne assez de sens aussi (d'ailleurs un peu différament 1.0 vs 2.0).

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses.
    J'ai réussi à faire ce que je voulais, enfin une partie.
    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
    <xsl:for-each select="recettes/recette[@fk_idPlat='P01']"> 
                            <xsl:variable name="idRecette" select="@pk_idRecette" /> <!-- on enregistre l'id de la recette dans la variable $idRecette -->
                            <table>
                                <tr><h2><xsl:value-of select="nomRecette"/></h2></tr>
                                <tr><td>Niveau de difficulté : <xsl:value-of select="difficulteRecette"/></td></tr>
                                <tr><td>Temps de préparation : <xsl:value-of select="tempsPrepa"/></td></tr>
                                <xsl:for-each select="compositions/composition">
                                    <xsl:if test="@fk_idRecette=$idRecette">
                                        <tr><td><xsl:value-of select="quantite"/></td></tr>
                                    </xsl:if>
                                </xsl:for-each>
                                <tr><td><xsl:value-of select="derouleRecette"/></td></tr>
                                <tr><td>URL de la source : <xsl:value-of select="sourceRecette"/></td></tr>
                            </table>
                        </xsl:for-each>
    Mon 2eme for-each ne fonctionne pas. Je veux me placer dans un autre element Composition et si @fk = $pk alors il m'affiche les quantités.

  10. #10
    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
    Le même problème et la même façon de se corriger que j'ai soulevés là haut. Il faut comprendre le noeud en contexte une fois on entre dans un xsl;for-each c'est le noeud étant sélectionné et il faut prendre la mesure, une façon ou une autre, si il n'est pas ce qu'on veut ou ce qui est plus convenable. Ici on utilise le xpath absolu. Il y a d'autre façon de le faire bien entendu.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                                <!-- 
                                <xsl:for-each select="compositions/composition">
                                    <xsl:if test="@fk_idRecette=$idRecette">
                                        <tr><td><xsl:value-of select="quantite"/></td></tr>
                                    </xsl:if>
                                </xsl:for-each>
                                -->
                                <xsl:for-each select="/catalogue/compositions/composition[@fk_idRecette=$idRecette]">
                                    <tr><td><xsl:value-of select="quantite"/></td></tr>
                                </xsl:for-each>

  11. #11
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup !!!
    J'ai enfin compris le système, ça coule de source maintenant

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/08/2006, 20h35
  2. [DOM] Insertion d'éléments avec DOM
    Par TheReturnOfMuton dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 27/06/2006, 15h33
  3. Liaison de table avec une autre base de donnée
    Par freya91 dans le forum Access
    Réponses: 1
    Dernier message: 03/06/2006, 00h08
  4. Compter nombre d'éléments avec valeur X dans un formulaire
    Par p0Kep0K dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/11/2005, 15h49
  5. [CR7] liaison sous etat avec etat principal
    Par brahime dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 04/01/2005, 11h58

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