|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : janvier 2007 Messages : 27 ![]() |
Bonjour
je cherche une expression XPath qui permet de retourner la position d'un élément dans un NodeSet avec un critère. par exemple dans le code suivant, je cherche la position de l'élément "personne" ayant @id="p23": Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Tlouye Ci Inscription : mars 2004 Messages : 1 456 ![]() |
Essaye ça : /personnes/personne[@id='p23']/position().
Ca te donnera la position de l'élément "personne" relativement à son élément parent "personnes". |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : janvier 2007 Messages : 27 ![]() |
Merci pour la réponse, mais l'expression XPath
Code :
/personnes/personne[@id='p23']/position() En fait, la dernière étape de l'expression (/position()) ne respecte pas la syntaxe XPath: Axe::test [predicat]. De plus la fonction position() doit figurer dans la partie prédicat, parce qu’elle n'a pas d'argument. |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Tlouye Ci Inscription : mars 2004 Messages : 1 456 ![]() |
Alors essaye ça : position(/personnes/personne[@id='p23']) ou ça : count(/personnes/personne[@id='p23']/preceding-sibling::personne)+1.
|
|
|
10
|
|
|
#5 | ||||
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 092 ![]() |
À ma connaissance en XPath ce n'est pas possible.
Et en fait en XSLT je ne sais pas vraiment comment faire ça. Voici certaines approches : Code :
Code :
|
||||
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : janvier 2007 Messages : 27 ![]() |
Je te remercies Loceka l'expression : count(/personnes/personne[@id='p23']/preceding-sibling::personne)+1. marche très bien.
Est ce qu'on peut généraliser cette solution? là je ne sais pas. |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Tlouye Ci Inscription : mars 2004 Messages : 1 456 ![]() |
Qu'est-ce que tu entends par "généraliser" ?
|
|
|
00
|
|
|
#8 | |||||
|
Membre confirmé
![]() Inscription : octobre 2011 Messages : 188 ![]() |
Citation:
Supposons un document plus élaboré tout en gardant id qui soit unique (ce n'est nécessaire mais ça simplifie le discours) pour illustration: Code :
[1] [1.1] ensemble ordonné: (//personne) [1.2] localisation du noeud: (//personne)[@id='p23'] [1.3] position index: 5 [1.4] xpath: count((//personne)[@id='p23']/preceding::personne)+1 [2] [2.1] ensemble ordonné: (//*) [2.2] localisation du noeud: (//*)[@id='p23'] [2.3] position index: 8 [2.4] xpath: count((//*)[@id='p23']/preceding::*)+1 [3] [3.1] ensemble ordonné: (/personnes/personne) [3.2] localisation du noeud: (/personnes/personne)[@id='p23'] [3.3] position index: 2 [3.4] xpath: count((/personnes/personne)[@id='p23']/preceding-sibling::personne)+1 [4] [4.1] ensemble ordonné: (/personnes/*) [4.2] localisation du noeud: (/personnes/*)[@id='p23'] [4.3] position index: 4 [4.4] xpath: count((/personnes/*)[@id='p23']/preceding-sibling::*)+1 Voici un xslt pour illustrer ça. Code :
|
|||||
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 092 ![]() |
Bien vu, merci pour le truc de l'équivalence count() <=> position.
|
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Inscription : janvier 2007 Messages : 27 ![]() |
ce qu'il faut retenir, selon le contexte de la position recherché, (position parmi tous les éléments ou parmi un ensembles des mêmes élément) on doit compter le nombre des éléments précédents ou nombre des frères précédents.
|
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 092 ![]() |
Ce qu'il faut retenir, c'est qu'il faut compter le bon nombre de choses en fonction de ce qu'on cherchait à obtenir.
|
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Tlouye Ci Inscription : mars 2004 Messages : 1 456 ![]() |
Ce seront toujours des frères (preceding-sibling) mais dans certains cas on compte seulement les éléments qui ont le même nom (dans ce cas, tous les éléments personne), dans d'autres cas on compte tous les frères.
|
|
|
00
|
|
|
#13 |
|
Invité régulier
![]() Inscription : janvier 2007 Messages : 27 ![]() |
Merci pour les précisions, thelvin à mieux exprimer ce que je voulais dire, tous dépend des cas.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com