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 :

tester la définiton d'une variable


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 791
    Points
    15 791
    Par défaut tester la définiton d'une variable
    Bonjour,

    Cette fois ci j'ai un problème de variable.
    J'ai un "for-each" qui parcours une liste de nom et l'affiche et j'aimerai détecter quand l'initiale du nom change pour mettre un style css spécial
    Pour cela je met l'initiale dans une variable mais lors du 1er passage j'ai une erreur parce que ma variable n'est pas definie

    J'ai rajouté une initialisation avant le début de ma boucle (code ci-dessous) mais là je recois une erreur "conflicting variable bindings 'initPrecedant'" !!
    je ne comprend pas le problème ! est ce que quelqu'un peut m'expliquer ?
    ou il y a peut être une autre façon 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
    22
    23
    24
    25
    26
    27
    28
    <xsl:template match="/">
     
    <xsl:variable name="initPrecedant">
        <xsl:value-of select="A"/>
    </xsl:variable>
     
    <table>
     
        <xsl:for-each select="auteurs/a">
            <xsl:sort select="."/>
     
            <tr>
                <td nowrap="nowrap">
                    <xsl:value-of select="$initPrecedant"/> - 
                    <xsl:value-of select="substring(.,1,1)"/> - 
                    <xsl:value-of select="." disable-output-escaping="yes"/>
                </td>
            </tr>
     
            <!xsl:variable name="initPrecedant">
                <xsl:value-of select="substring(.,1,1)"/>
            </xsl:variable>
     
        </xsl:for-each>
     
    </table>
     
    </xsl:template>

  2. #2
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut Re: tester la définiton d'une variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:variable name="initPrecedant">
        <xsl:value-of select="'A'"/>
    </xsl:variable>
    (il faut mettre A entre simple quote, selon c'est le chemin A qui est recherché par XPATH)

    Ou plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:variable name="initPrecedant">
        <xsl:text>A</xsl:text>
    </xsl:variable>
    @+ Haypo

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 791
    Points
    15 791
    Par défaut
    merci c'est corrigé mais avec les 2 versions j'ai toujours la même erreur
    la ligne indiquée dans l'erreur c'est au moment où je met l'initiale dans la variable !

  4. #4
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    je crois que tu ne peux pas redéfinir une variable xsl dans la même portée c'est à dire dans le noeud courant ou dans ses ancêtres...

    si tes données étaient déjà triées, la solution serait simple : il suffirait de remplacer le for-each par une fonction template récursive. Maintenant il serait certainement possible de déterminer soi-même (sans passer par l'instruction sort) l'élément suivant dans l'ordre choisi avant chaque appel de la fonction... Mais peut être devras-tu simplement contourner ce problème

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 791
    Points
    15 791
    Par défaut
    justement je suis obligé de passer par un "for-each" mes données sont aps triées !

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 791
    Points
    15 791
    Par défaut
    j'ai essayé de faire un test mais là je n'arrive pas à accéder à l'élément précédant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		<xsl:if test="position() != 1">
     
    		    <xsl:variable name="p">
                		<xsl:value-of select="string(/auteurs/a[position()-1])"/>
            	    </xsl:variable>
     
                        <xsl:value-of select="substring($p,1,1)"/>
     
    		</xsl:if>
    le resultat du value-of est completement vide, rien n'est écrit

    j'ai aussi essayé de mettre directement l'affichage de la variable $initPrecedant dans le "if" mais ce bougre essaye d'y accéder quand même et je recois un message "variable indéfinie" !!!

  7. #7
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 791
    Points
    15 791
    Par défaut
    ouf trouvé

    il fallait mettre ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:variable name="p">
        <xsl:value-of select="preceding-sibling::*[1]"/>
    </xsl:variable>
    (merci aux tutoriel http://jerome.developpez.com/xmlxsl/...page=&rpage=16 )

    en + ca selectionne bien ce que je veux dans la liste triée et tout et tout

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 791
    Points
    15 791
    Par défaut
    loupé ca ne tient pas compte du tri mais là j'en ai marre je vais trier mes éléments à le main et faire un template

  9. #9
    Membre confirmé
    Avatar de grishka
    Inscrit en
    Janvier 2003
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 285
    Points : 499
    Points
    499
    Par défaut
    ben vi car preceding-sibling renvoie le noeud précédent du noeud de l'arbre et non du sous-arbre résultant du tri (en fait il n'y a pas de sous-arbre résultat, le tri est fait à la volée (ca doit être un pauvre tri par insertion))... dommage

    Le truc serait d'obtenir un sous-arbre résultat trié, mais la je ne sais pas si c'est possible. Il faudrait une instruction xpath du style sort(/auteurs/a) ...

  10. #10
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 791
    Points
    15 791
    Par défaut
    comme je n'ai pas envie de trier à la main (missa être fénéant ) et que je n'ai pas besoin d'optimiser mon script en ressource ou en temps de calcul, j'ai utilisé une methode "bourrin" : je fais d'abord passer mon XML dans un XSL qui fait seulement le tri et ensuite le résultat passe dans un XSL qui fait la mise en forme et c'est bon :-)

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

Discussions similaires

  1. Tester le type d'une variable
    Par Débéa dans le forum Général Python
    Réponses: 2
    Dernier message: 03/08/2006, 16h45
  2. Tester le type d'une variable
    Par mzt.insat dans le forum Linux
    Réponses: 5
    Dernier message: 30/05/2006, 18h37
  3. Tester l'existence d'une variable
    Par rukiaa dans le forum Langage
    Réponses: 6
    Dernier message: 14/05/2006, 23h11
  4. Tester l'existence d'une variable?
    Par Death83 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/03/2006, 21h53
  5. Réponses: 3
    Dernier message: 19/08/2005, 14h24

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