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 :

Recuperer element à partir de son attribut [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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 25
    Par défaut Recuperer element à partir de son attribut
    Bonjour,

    Bon vu qu'un un exemple vaut mieux qu'un long discours :
    J'ai un document xml avec une balise racine constitué de balises personnes comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <personne id="idpersonne">
     <nom>nom de la personne</nom>
    </personne>
    Et des balises familles comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <famille id="idefamille">
     <membre personne="idmembre1"/>
     <membre personne="idmembre2"/>
    .
    .
    .
    </famille>
    Maintenant dans le xslt lorsque je vais un template match sur famille je peux récupérer les id des membres (avec <xsl:value-of select="membre/@personne"/>) mais j'aimerai savoir si comment faire pour récupérer le nom des personnes correspondant aux id récupérés.

    Merci d'avance.

  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
    Hello,

    techniquement il suffit de juste aller chercher tous les éléments <personne> qui ont l'id voulue.
    En principe "ça a l'air" de donner quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="//personne[@id = @personne]"> <!-- Sauf que ça marche pas -->
    Mais ça marche pas... parce que, si on écrit juste @personne entre les [ ] c'est la même chose que comme on écrit @id : c'est un attribut de la balise <personne> et pas de la balise <membre> qu'on était en train de lire.
    Il faut moyen de dire, "l'attribut @personne, c'est celui de l'élément en cours de traitement XSLT, pas celui qui est à gauche des [ ] dans le XPath."
    Et ça se dit avec la fonction current() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="//personne[@id = current()/@personne]">
    Reste à faire en sorte que tes éléments <membre> soient vraiment les éléments en cours de traitement XSLT. Par exemple avec un for-each :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="famille">
      <xsl:for-each select="membre">
        <xsl:value-of select="//personne[@id = current()/@personne]">
      </xsl:for-each>
    </xsl:template>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 25
    Par défaut
    Ça fonctionne, merci bien pour l'explication.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 25
    Par défaut
    Bon j'ai une autre question plus ou moins hs mais toujours sur le même exemple, donc je ne veux pas créer de nouveau sujet pour :
    La balise personne contient maintenant d'autres informations en plus du nom (prenom,sexe,etc...), sachant que la balise nom n'est pas obligatoire. J'ai un <xsl:template match="personne"> qui affiche toutes les informations sur cette personne, maintenant j'aimerai savoir si c'est possible d'afficher ceci :

    A :

    Les informations sur toutes les personnes dont le nom commence par A

    B :

    Les informations sur toutes les personnes dont le nom commence par B

    .
    .
    .
    Z :

    Les informations sur toutes les personnes dont le nom commence par Z

    Autres :
    Les informations sur toutes les personnes dont le nom n'a pas été renseigné.


    J'ai pensé à sort mais d'une il ne permet pas d'afficher les lettres entreles personnes, et de deux il affiche d'abord les personnes dont le nom n'a pas été renseigné, et moi je veux l'inverse.

    Merci d'avance.

    Edit : trouvé en utilsant start-with.

  5. #5
    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
    Humm... En XSLT 1.0 c'est un peu lourd.

    Problème numéro 1: tu as besoin de boucler sur les lettres de l'alphabet. Pour pouvoir les afficher.

    Et il y a juste rien du tout qui permette de dire "de A à Z" ni qui permette de faire une boucle sur autre chose que des nœuds XML.
    Du coup, pour boucler sur les lettres on fait quelque chose comme ça :

    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
    <!-- Les lettres de l'alphabet. C'est une string, pas une sélection d'élément, c'est pour ça que c'est entre "' et '" -->
    <xsl:variable name="upperLetters" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
     
    <!-- template récursif qui va parcourir toutes les lettres, l'une après l'autre. -->
    <xsl:template name="displayForLetter">
      <!-- Paramètre de récursion, qui indique quelle est la lettre en cours. Par défaut on commence avec A -->
      <xsl:param name="letter" select="'A'" />
     
      <xsl:value-of select="$letter"/>
     
      <ul>
        <!-- Et là on met la liste des informations pour cette lettre -->
      </ul>
     
      <!-- Sauf si on a traité la dernière lettre, Z, il faut rappeler le template avec la letter suivante -->
      <xsl:if test="$letter != 'Z'">
        <!-- Prendre toutes les lettres après la lettre en cours -->
        <xsl:variable name="afterLetter" select="substring-after($upperLetters, $letter)"/>
        <!-- Garder juste la première -->
        <xsl:variable name="nextLetter" select="substring($afterLetter, 1, 1)"/>
        <xsl:call-template name="displayForLetter">
          <xsl:with-param name="letter" select="$nextLetter"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
     
    <!-- Pour appeler le template récursif, la première fois on le fait sans paramètre pour que 'A' soit utilisé par défaut -->
    <xsl:template match="/">
      <xsl:call-template name="displayForLetter"/>  
    </xsl:template>
    C'est chiant, hein ?

    Bon, c'est pas la seule façon de faire, on pourrait faire un regroupement par première lettre, mais c'est lourdingue aussi.

    Problème numéro 2 : Pendant qu'on s'occupe d'une lettre, il faut arriver à trouver les personnes dont le nom commence par cette lettre.

    Si on est sûr que tous les noms commencent par une lettre majuscule sans accent, bref comme celles de la variable $letter, c'est tranquille.
    Mais s'il faut gérer aussi les minuscules ou les accents, c'est bien plus galère.

    Ça peut se faire avec une suite d'appels à translate(), mais on verra ça en second lieu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 25
    Par défaut
    Merci encore une fois, ma solution temporaire était d'écrire <xsl:apply-templates select="racine/personne[starts-with(nom, 'A')]"> pour chaque lettre mais c'était encore plus lourd.

    Donc au final ca donne 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
    15
    16
    17
     
    <xsl:template name="displayForLetter">
      <!-- Paramètre de récursion, qui indique quelle est la lettre en cours. Par défaut on commence avec A -->
      <xsl:param name="letter" select="'A'" />
     
      <xsl:value-of select="$letter"/>
     
     <xsl:apply-templates select="racine/personne[starts-with(nom, $letter)]">
     
      <xsl:if test="$letter != 'Z'">
        <xsl:variable name="afterLetter" select="substring-after($upperLetters, $letter)"/>
        <xsl:variable name="nextLetter" select="substring($afterLetter, 1, 1)"/>
        <xsl:call-template name="displayForLetter">
          <xsl:with-param name="letter" select="$nextLetter"/>
        </xsl:call-template>
      </xsl:if>
    </xsl:template>
    Sachant que <xsl:template match="personne"> affiche les informations d'une personne

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

Discussions similaires

  1. recuperer un element javascript par son nom
    Par fafoula dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/09/2008, 16h39
  2. Réponses: 5
    Dernier message: 23/01/2007, 15h36
  3. Réponses: 1
    Dernier message: 06/12/2006, 15h24
  4. Réponses: 2
    Dernier message: 21/09/2006, 13h58
  5. Réponses: 3
    Dernier message: 12/07/2006, 16h33

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