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 :

[XSLT]retourner la position


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut [XSLT]retourner la position
    Bonjour,

    Je suis sur une balise dans un élément unbounded (répétitif) et j'aimerais mettre dans ma balise la valeur de la position de mon élément!

    en d'autre terme:

    La sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Toto>
    <albert><Num>1</Num><Nom>Sandoz</Nom></albert>
    <albert><Num>2</Num><Nom>Delacasa</Nom></albert>
    <albert><Num>3</Num><Nom>Epinosa</Nom></albert>
    </Toto>
    Le xsl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="Num">
    <Num>
    <xsl:value-of select="............................"/>
    </Num>
    </xsl:template>
    Comment faire pour dans ce template mettre la valeur de position de l'élément albert? Quelle expression XPath mettre dans le value-of?

    Merci

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    je ne comprends pas, le XML que tu présentes est ton XML d'entrée, ou la sortie que doit produire la transformation avec XSLT ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Désolé je me suis mal exprimer

    C'est le xml de sortie avec la bonne numérotation!

    Dans le xsl on est dans un for-each (sur albert) et on fait un apply-template sur ce noeud et je voudrais savoir comment depuis ce template faire pour avoir la position d'albert?


    Merci

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Poste ton XML d'entrée, ce sera plus simple, parce que là j'ai du mal à me le figurer...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Ok je comprend maintenant ce que j'ai mal expliqué:

    c'est le même mais sans numérotation!

    Je sais je fais un template pour le Num c'est peut-être pas optimale mais y a des raisons (ce n'est que le début de ce que je veux faire au final)!

    Merci

  6. #6
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut,

    Si tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(../preceding-sibling::albert) + 1
    Quand pense tu GrandFather? une bonne solution? ou pas très optimale?

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bon alors, si j'ai tout bien compris, il suffit d'utiliser la fonction position(), qui renvoie la position du noeud courant dans la liste courante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:for-each select="albert">
      <num>
        <xsl:value-of select="position()"/>
      </num>
    </xsl:for-each>
    Le for-each établit une liste de tous les "albert", et fait une itération dessus. A chaque itération le noeud courant est un "albert", et position() renvoie l'index de ce noeud courant dans cette liste.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Ok merci pour vos réponse!

    Celle de Virgul convient parfaitement

    celle de granfather ne me convient pas car j'aimerais vraiment que ca soit dans un template et pas dans la boucle for each! Pour pouvoir appeler ce template plusieurs fois car il n'y aura pas que la position dans cette balise "Num"!

    le xsl entier:

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <Toto><xsl:apply-templates select="Toto"/></Toto>
    </xsl:template>
    <xsl:template match="Toto">
    <xsl:for-each select="albert">
    <albert><xsl:apply-templates select="Num"/></albert>
    </xsl:for-each>	
    </xsl:template>
    <xsl:template match="Num"> 
    <Num><xsl:value-of select="count(../preceding-sibling::albert) + 1"/></Num> 
    </xsl:template>
    </xsl:stylesheet>
    Mais es-ce que cette solution (expression) est optimale (comme l'a souligné Virgul)?

    Merci

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    J'aurais dû le préciser, mais position() fonctionne également dans un template. <xsl:apply-templates> et <xsl:for-each> ont de ceci en commun qu'ils produisent une liste de noeuds, et position() donne la position du noeud courant dans cette liste, que le noeud courant soit celui d'une itération d'un <xsl:for-each> ou celui d'un template déclenché par un <xsl:apply-templates>. Ceci dit, tel qu'est écrit ton template cette fonction est inutilisable telle quelle ici. Il vaut mieux utiliser <xsl:number>, dédié à la numérotation.

    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
    <?xml version="1.0" encoding="UTF-8"?> 
      <xsl:stylesheet version="1.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
      <xsl:template match="/"> 
        <Toto><xsl:apply-templates select="Toto"/></Toto> 
      </xsl:template> 
     
      <xsl:template match="Toto"> 
        <xsl:for-each select="albert"> 
            <albert><xsl:apply-templates select="Num"/></albert> 
        </xsl:for-each>    
      </xsl:template> 
     
      <xsl:template match="Num"> 
        <Num><xsl:number count="Num" level="any"/></Num> 
      </xsl:template> 
     
    </xsl:stylesheet>

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 159
    Points : 77
    Points
    77
    Par défaut
    Ok merci GrandFather pour la solution qui sera de toute facon plus performante que l'expression XPath!


    Et encore un grand merci a vous deux!


    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/03/2015, 10h56
  2. Réponses: 9
    Dernier message: 02/06/2013, 18h24
  3. Retourner la position d'un caractère
    Par khaled_prg dans le forum Débuter avec Java
    Réponses: 22
    Dernier message: 06/01/2012, 01h42
  4. [XSLT 2.0] position du noeud courant
    Par fanette dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/03/2007, 11h48
  5. [XSLT] Obtenir la position d'un noeud
    Par zoubidaman dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/09/2006, 10h34

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