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 :

[XSL] position()


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2003
    Messages : 17
    Par défaut [XSL] position()
    Bonjour a tous,

    une question pour les gouroux du XSL, je travaille occasionellement avec, et j'ai parfois quelques problemes...
    aujourd'hui le pb qui se pose a moi vient de la fonction position(), qui doit retourner la position réelle d'un element dans son parent, de facon a ce que si on utilise l'instruction xsl:sort, la position retournée ne sera pas la position dans l'odre de trie, mais bien la position réelle...

    et bien tout mon problème est la, cela est il aussi valable avec xsl:for-each ?

    parce que dans mon cas, mon template est appelé dans un for-each, et position() me retourne toujours 1. si je passe un parametre, j'ai bien differentes valeurs mais qui correspondent a l'ordre dans mon for-each, qui lui est trié, et non a l'ordre dans le document...

    vous pouvez voir une démo à :
    http://manolo.kicks-ass.net/tabel/index.htm

    et la xsl à :
    http://manolo.kicks-ass.net/tabel/basic.xsl
    et le pb a la ligne 39.

    la position doit se retrouver dans l'id de chaque row ("row_1").

    si j'esqqi current()[position()] j'ai alors bien la position souhaitée, mais suivie de la valeur de mon element....

    Et la je nage un peu, alors si quelqu'un pige mieux que moi et a deux minutes a perdre...

    ben bienvenue !

    d'avance merci, à toi qui prendra le temps d'essayer de comprendre mon pb !!

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 654
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 654
    Par défaut
    j'ai déjà eu un problème de tri et de "position()" et finallement j'ai fait 2 XSL : le 1er fait les tris et le 2eme fait le reste du traitement

  3. #3
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 27
    Par défaut
    aujourd'hui le pb qui se pose a moi vient de la fonction position(), qui doit retourner la position réelle d'un element dans son parent, de facon a ce que si on utilise l'instruction xsl:sort, la position retournée ne sera pas la position dans l'odre de trie, mais bien la position réelle...
    Bonjour,

    A priori ceci est possible mais je n'ai pas pu tester... si tu peux voir si ceci marche :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <exemple topic="methode de regroupement">
    <noeud class="petit">A
    </noeud>
    <noeud class="moyen">B
    </noeud>
    <noeud class="gros">C
    </noeud>
    <noeud class="petit">D
    </noeud>
    <noeud class="moyen">E
    </noeud>
    <noeud class="gros">F
    </noeud>
    <noeud class="moyen">G
    </noeud>
    <noeud class="gros">H
    </noeud>
    <noeud class="petit">I
    </noeud>
    <noeud class="gros">J
    </noeud>
    <noeud class="petit">K
    </noeud>
    <noeud class="moyen">L
    </noeud>
    </exemple>
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text"/>
    	<xsl:template match="/">
    		<xsl:apply-templates/>
    	</xsl:template>
    	<xsl:template match="exemple">
    		<xsl:apply-templates select="noeud">
    			<xsl:sort select="@class" order="ascending"/>
    		</xsl:apply-templates>
    	</xsl:template>
     
    	<xsl:template match="noeud">
    		<xsl:call-template name="sortieNoeuds"/>
    	</xsl:template>
     
    	<xsl:template name="sortieNoeuds">
    <xsl:variable name="indiceNoeud" select="position()"/>
    <xsl:value-of select="@class"/>
    <xsl:text> : </xsl:text>
    <xsl:value-of select="text()"/>
    <xsl:text> position : </xsl:text>
    <xsl:value-of select="position()"/>
    <xsl:text>|
    </xsl:text>
    <xsl:if test="not(position()=last())">
    <xsl:text>Noeud suivant dans le tri :</xsl:text>
    <xsl:call-template name="noeudSuivant">
    <xsl:with-param name="indiceNoeudSuivant" select="$indiceNoeud+1"/>
    </xsl:call-template>
    </xsl:if>
    	</xsl:template>
     
    	<xsl:template name="noeudSuivant">
    <xsl:param name="indiceNoeudSuivant" select="0"/>
    <xsl:for-each select="/exemple/noeud">
    <xsl:sort select="@class" order="ascending"/>
    <xsl:if test="position()=$indiceNoeudSuivant">
    <xsl:value-of select="text()"/>
    </xsl:if>
    </xsl:for-each>
    	</xsl:template>
     
    </xsl:stylesheet>
    Ceci devrait trier et afficher les noeuds par @class en indiquant pour chaque noeud :
    la classe, la position dans le tri, le texte et le texte du noeud
    suivant avec la feuille xsl suivante :

    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
    36
     
    gros : C
      position : 1|
    Noeud suivant dans le tri :F
    gros : F
      position : 2|
    Noeud suivant dans le tri :H
    gros : H
      position : 3|
    Noeud suivant dans le tri :J
    gros : J
      position : 4|
    Noeud suivant dans le tri :B
    moyen : B
      position : 5|
    Noeud suivant dans le tri :E
    moyen : E
      position : 6|
    Noeud suivant dans le tri :G
    moyen : G
      position : 7|
    Noeud suivant dans le tri :L
    moyen : L
      position : 8|
    Noeud suivant dans le tri :A
    petit : A
      position : 9|
    Noeud suivant dans le tri :D
    petit : D
      position : 10|
    Noeud suivant dans le tri :I
    petit : I
      position : 11|
    Noeud suivant dans le tri :K
    petit : K
      position : 12|
    Si cela marche tu pourras me dire si les performances sont au redez-vous ou pas ?

    Pour ta question sur le for-each je n'ai aps de réponse à priori...

    Haaz

Discussions similaires

  1. [XSL-FO] bizarrerie sur absolute-position avec tableau
    Par titouille dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 16/09/2009, 15h42
  2. [XSL] xsl:number / position()
    Par Naki dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/07/2008, 09h32
  3. [XSL][XPATH] pour les tueurs (position() generate-id....
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 15/11/2005, 10h26
  4. [XSL][XHTML] test sur position de noeuds (text() et autres)
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 05/09/2005, 17h47
  5. [xml-xsl] Probleme avec position()
    Par seb30 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 21/04/2005, 11h10

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