1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 208
    Points : 206
    Points
    206

    Par défaut XML/XSLT ranger par ordre alphabétique

    Bonjour à tous,
    j’étudie actuellement une partie de mon cours qui traite le XSLT et on me demande dans un exercice, à partir d'un document xml, d'afficher le noms des élèves dans l'ordre alphabétique ainsi que leur moyenne.
    Je m'attaque déjà à la partie qui permet de ranger dans l'ordre les noms, le soucis c'est que les noms s'affichent mais pas du tout dans l'ordre et je comprend pas pourquoi.

    code 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
    17
    18
    19
    <?xml version="1.0" encoding="ISO-8859-1" ?>
     <?xml-stylesheet href="class.xsl" type="text/xsl" ?>
     <universite>
     <etudiant><nom>Réjean Tremblay</nom>
     <cours sigle="INF8430" note="89" />
     <cours sigle="INF1030" note="69" />
     <cours sigle="INF1230" note="75" /></etudiant>
     <etudiant><nom>Martin Lambert</nom>
     <cours sigle="INF8430" note="75" />
     <cours sigle="INF1030" note="72" />
     <cours sigle="INF1230" note="73" /></etudiant>
     <etudiant><nom>Luc Alain</nom>
     <cours sigle="INF9430" note="39" />
     <cours sigle="INF1030" note="89" />
     <cours sigle="INF1230" note="79" /></etudiant>
     <etudiant><nom>Olive Saint-Amant</nom>
     <cours sigle="INF8430" note="91" />
      <cours sigle="INF1230" note="99" /></etudiant>
     </universite>
    voici ce que je suis en train de faire:
    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
    <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:template match="etudiant">
     <html>
     <body>
     <table border="1">
     <tr>
     <td>Étudiant </td>
     <td> Moyenne </td>
     </tr>
     </table>
     </body>
     </html>
     <xsl:apply-templates select="nom" >
     <xsl:value-of select="nom"/>
     <xsl:sort select="substring-after(nom,' ')" order="ascending"/>
     </xsl:apply-templates>
     
     </xsl:template>
    </xsl:stylesheet>
    voici ce que j'obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><table border="1"><tbody><tr> <td>Étudiant </td> <td> Moyenne </td> </tr></tbody></table>Réjean Tremblay <table border="1"><tbody><tr> <td>Étudiant </td> <td> Moyenne </td> </tr></tbody></table>Martin Lambert <table border="1"><tbody><tr> <td>Étudiant </td> <td> Moyenne </td> </tr></tbody></table>Luc Alain <table border="1"><tbody><tr> <td>Étudiant </td> <td> Moyenne </td> </tr></tbody></table>Olive Saint-Amant </body></html>
    Merci d'avance pour votre aide.
    While.dede

  2. #2
    Membre expérimenté
    Inscrit en
    octobre 2011
    Messages
    1 001
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 001
    Points : 1 733
    Points
    1 733

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:apply-templates select="nom" >
     <xsl:value-of select="nom"/>
     <xsl:sort select="substring-after(nom,' ')" order="ascending"/>
    </xsl:apply-templates>
    Deux erreurs sérieuses déjà.
    [1] xsl:value-of comme enfant de xsl:apply-templates, ce n'est pas permise.
    [2] xsl:sort select="substring-after(nom,' ')", l'idée n'est pas mal, mais ça n'a un sens et n'est effectif que pour une structure du genre comme ceci, qui évidemment n'est pas le cas.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <nom>
        <nom>abc yyy</nom>
        <nom>def xxx</nom>
        <nom>ghi zzz</nom>
    </nom>

    Si vous voulez voir un effet souhaîté, un prototype du genre comme ça.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <xsl:template match="universite">
        <xsl:apply-templates select="etudiant">
            <xsl:sort select="substring-after(nom, ' ')" order="ascending" />
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="etudiant">
        <etudiant>
            <xsl:value-of select="nom" />
        </etudiant>
    </xsl:template>

    Le reste, attention, c'est encore loin d'une solution sensible.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 208
    Points : 206
    Points
    206

    Par défaut

    Je vous remercie de votre aide tsuji.
    je vais essayer de faire fonctionner cette partie en m'appuyant sur le prototype que vous m'avez donné et je reviens vers vous dès que ça marche, ou alors et je m'en excuse d'avance, parce que je serais bloqué par un problème.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 208
    Points : 206
    Points
    206

    Par défaut

    C'est bon ça marche, maintenant je m'attaque à la partie moyenne.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 208
    Points : 206
    Points
    206

    Par défaut

    Petite difficulté supplémentaire on me demande de ne pas utiliser les crochets.
    Pour calculer la moyenne il faut que je fasse comme cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <xsl:value-of select="(count(//cours/@note[@sigle=current()/@sigle]))div(count(//cours[@sigle=current()/@sigle]))"/>

  6. #6
    Membre expérimenté
    Inscrit en
    octobre 2011
    Messages
    1 001
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 001
    Points : 1 733
    Points
    1 733

    Par défaut

    @note[@sigle=...], ça ne se fait jamais parce que ça s'implique un attribut sigle comme un enfant de l'attribut note.

    Plutôt comme ça à la première vue en supposant sans complication de toutes sortes.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="sum(//cours[@sigle=current()/@sigle]/@note) div count(//cours[@sigle=current()/@sigle])"/>

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 208
    Points : 206
    Points
    206

    Par défaut

    D'accord merci pour la correction.
    Par contre que veux dire "NaN" c'est ce que j'obtient à la place de la moyenne

  8. #8
    Membre expérimenté
    Inscrit en
    octobre 2011
    Messages
    1 001
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 001
    Points : 1 733
    Points
    1 733

    Par défaut

    Pour ce genre de calcul numérique, il faut évidemment s'assurer que (1) tous @note soient convertibles chacun d'eux à un nombre; (2) le count() ne se donne un résultat de zéro; (3) chaque élément sélectionnée comporte bien ayant l'attribut note aussi que sigle...

    Et maintenant, les cours sélectionnées sont déterminée par un @sigle=current()/@sigle. Si current() est un cours en contexte elle aussi, il n'y a pas de raison que le résultat de count() soit zéro, il est au moins un. Par conséquence, supposons que les @note soient bien formées, la question qui se pose est quel est le contexte qui représente current() ? Je crois c'est le suspect numéro 1 pour le moment. Par exemple, ce n'est pas etudiant, j'espère ?!

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 208
    Points : 206
    Points
    206

    Par défaut

    Merci de ton aide, alors j 'ai regardé et current représente bien étudiant d'où un soucis.
    Pour te faciliter je te remet le code xml et le mien en dessous:
    code 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
    17
    18
    19
    <?xml version="1.0" encoding="ISO-8859-1" ?>
     <?xml-stylesheet href="class.xsl" type="text/xsl" ?>
     <universite>
     <etudiant><nom>Réjean Tremblay</nom>
     <cours sigle="INF8430" note="89" />
     <cours sigle="INF1030" note="69" />
     <cours sigle="INF1230" note="75" /></etudiant>
     <etudiant><nom>Martin Lambert</nom>
     <cours sigle="INF8430" note="75" />
     <cours sigle="INF1030" note="72" />
     <cours sigle="INF1230" note="73" /></etudiant>
     <etudiant><nom>Luc Alain</nom>
     <cours sigle="INF9430" note="39" />
     <cours sigle="INF1030" note="89" />
     <cours sigle="INF1230" note="79" /></etudiant>
     <etudiant><nom>Olive Saint-Amant</nom>
     <cours sigle="INF8430" note="91" />
      <cours sigle="INF1230" note="99" /></etudiant>
     </universite>
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:template match="universite">
     <html>
     <body>
     <table border="1">
     <tr>
     <td>Étudiant </td>
     <td> Moyenne </td>
     </tr>
     
    <xsl:apply-templates select="etudiant">
       <xsl:sort select="substring-after(nom, ' ')" order="ascending" />
         </xsl:apply-templates>
     
    </table>
    </body>
    </html>
     
     </xsl:template>
     <xsl:template match="etudiant">
         <etudiant>
             <xsl:value-of select="nom" />
         </etudiant>
         <xsl:value-of select="sum(//cours[@sigle=current()/@sigle]/@note)div (count(//cours[@sigle=current()/@sigle]))"/>
     </xsl:template>
    </xsl:stylesheet>

  10. #10
    Membre expérimenté
    Inscrit en
    octobre 2011
    Messages
    1 001
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 001
    Points : 1 733
    Points
    1 733

    Par défaut

    On peut faire quelque chose illustrative comme ci-dessous. J'ai même aniticipé le besoin de formattage de nombre pour qui on place n'importe où qu'on veut mais comme enfant directe sous xsl:stylesheet une élément (dit, globale) xsl:decimal-format.
    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
    <xsl:decimal-format name="fr" decimal-separator="," grouping-separator="." />
     
    <xsl:template match="etudiant">
        <etudiant>
            <nom><xsl:value-of select="nom" /></nom>
                <xsl:for-each select="cours">
                    <cours signle="{@sigle}" note="{@note}">
                        <xsl:attribute name="classe-moyenne">
                            <xsl:value-of select="format-number(
                                sum(//cours[@sigle=current()/@sigle]/@note) div count(//cours[@sigle=current()/@sigle]),
                                '#,00',
                                'fr'
                            )"/>
                    </xsl:attribute>
                </cours>
            </xsl:for-each>
        </etudiant>
    </xsl:template>
    Là, j'ai mis de nombreux outils bien utiles pour plus tard. Mais, ceci étant dit, je ne peux pas remplacer toutes les études vous devrez faire vous-même sur les pistes que j'ai montré et démontré, ou remplacer vos professeurs et des cahiers du cours. Et ça va de soi, bien entendu. Une seule chose qu'il vous faut regarder de près pour ce genre de problème de regroupement, c'est l'élément xsl:key. Voilà tout.

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2015
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2015
    Messages : 208
    Points : 206
    Points
    206

    Par défaut

    D'accord, je te remercie beaucoup, je vais potasser le code et m'exercer un peu, par exemple en modifiant le code XML pour ensuite, en adaptant le code Xsl faire plusieurs essais .

    Je sais que j'ai demandé beaucoup d'aide et je m'en excuse encore, mais j'en suis qu'au début de ce cours sur l'xml et j'ai quelques difficultés à comprendre le xslt.
    Dans cette université on est vraiment obligé de se débrouiller tout seul, on a un tuteur qui est là pour nous conseiller que de manière générale, et on a nos cours avec des exemples et des exercices, mais c'est assez limité, du coup, des fois quand on se retrouve avec un exercice ou on galère on demande beaucoup d'aide à la communauté.
    Encore merci beaucoup Tsuji pour toute l'aide que tu m'as apportée.

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

Discussions similaires

  1. [XSLT] Tri par ordre alphabétique
    Par Xenna dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/06/2009, 17h00
  2. ranger par ordre alphabétique
    Par dev0712 dans le forum Débuter
    Réponses: 12
    Dernier message: 20/12/2008, 19h54
  3. ADO + ACCESS : Ranger par ordre alphabétique
    Par kurkaine dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/06/2006, 10h05
  4. Tri par ordre alphabétique
    Par orus8 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/04/2003, 19h27
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

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