Je voudrais sélectionner les x premiers éléments.
Un for-each les prend tous. Comment limiter aux 10 premiers par exemple?
J'imagine un truc du genre
Mais je sais pas...Code:<xsl:for-each select="item and position(item)<10">
Merci.
Version imprimable
Je voudrais sélectionner les x premiers éléments.
Un for-each les prend tous. Comment limiter aux 10 premiers par exemple?
J'imagine un truc du genre
Mais je sais pas...Code:<xsl:for-each select="item and position(item)<10">
Merci.
Ou plutôt comme ceci:Code:<xsl:for-each select="item[position() < 10]>"
Ben voui, c'est bien cela... :?Citation:
Envoyé par camboui
Oui, en effet, mais...
Voici mon code exact
Et ici, il m'en donne plus que 5. S'il y a par exemple 30 éléments "list" avec pour chacun un seul élément "item", il me sort tous les "item" (puisque qu'ils sont tous en position()=1 par rapport à leur parent direct qui est "list").Code:<xsl:for-each select="list/item[position() < 10]">
Et là, je sèche...
Merci
Puisque l'axe par défaut child ne convient pas, il faut utiliser l'axe descendant :
Code:<xsl:for-each select="descendant::item[position() < 10]">
les parentheses c'est pas mal quand on n'a des probleme avec les priorités d'execution sur xpath
selectionne les 9 premier fils de tous les listCode:list/item[position() < 10]
Selectionne les 9 premiers items qui sont fils de listCode:(list/item)[position() < 10]
grandfather: tsss,tsss :roll: :lol:
Ouais, sauf que c'est à utiliser avec précaution, surtout quand on utilise des axes inverses et des prédicats positionnels.Citation:
Envoyé par Erwy
Par exemple, soit le XML suivant :
L'expression XPath suivante :Code:
1
2
3
4
5
6
7
8 <?xml version="1.0" encoding="UTF-8"?> <test> <element>aaaa</element> <element>bbbb</element> <element>cccc</element> <element>dddd</element> <fin/> </test>
sélectionnera les noeuds suivants :Code:/test/fin/preceding::*[position() < 3]
Tandis que cette expression :Code:
1
2 <element>cccc</element> <element>dddd</element>
sélectionnera ceux-là :Code:(/test/fin/preceding::*)[position() < 3]
La raison en est que pour la première expression l'ordre du node-set renvoyé par preceding est préservé par le prédicat pour son évaluation, tandis que dans la deuxième le node-set est inversé pour suivre l'ordre du document. Pour éviter d'avoir à gérer ce genre de subtilité, il est préférable d'employer uniquement les parenthèses là où elles sont indispensables, comme avant des prédicats dans le cas d'union de node-sets, par exemple :Code:
1
2 <element>aaaa</element> <element>bbbb</element>
Code:(/test/element[3]|/test/fin)[1]
Ce qui n'est pas le cas ici :wink:Citation:
Envoyé par GrandFather
Puis si tu en viens a ce genre de chose je te rappelle que suivant les processeur, certains resultats d'axes change de sens et les unions ont le meme effet sur les positions finales des node-set que des parenthese (ce n'est pas un concat de noeud) alors le probleme des parenthese ca devient franchement secondaire la
Ne pas confondre precaution et empechement autrement on n'utiliserais plus un paquet de fonctionnalité xslt et xpath (qui ont parfois des propriétés annexes complexes)
J'en sais quelque chose... Je suis en train d'écrire une implémentation de XPath (en Python), et je peux te dire pour l'avoir épluchée que la spécification du W3C n'est pas toujours d'une clarté limpide. Chaque éditeur y a été de son interprétation, d'où les divergences relevées surtout sur l'ordonnancement des noeuds.Citation:
Envoyé par Erwy
Il n'y en a pas tant que ça. Les seules disparités significatives que j'ai relevées jusqu'ici portaient sur les parenthèses, l'union, et les noeuds de type namespace. Savoir que des effets de bord existent sur certaines fonctionnalités n'empêche pas de les utiliser, mais on doit garder à l'esprit les problèmes de portabilité que peut représenter le fait qu'ils peuvent différer d'une implémentation à une autre.Citation:
Envoyé par Erwy
celui auquel je pense n'a pas cette excuse :roll:Citation:
Envoyé par GrandFather
Pour les parentheses et union cette partie n'est pas si absconse que ca je trouve(surtout avec une trad :lol: )
http://www.w3.org/TR/xpath#node-sets
Par contre je n'arrive pas a mettre la main sur la gestion des parentheses:Citation:
The Predicate filters the node-set with respect to the child axis.
Ainsi sur xmlspy il est obligatoire de toujours placer la premier parenthese au tout debut de l'expression
ainsi
est valideCode:((/A/B)[2]/C)[1]
mais pas
Ce qui n'est pas aberrant en soi mais j'aurais bien aimé une description et une explicationCode:(/A/B)[2]/(C[1])
Ce n'est pas si abscons effectivement quand on se rend compte que cet axe implicite pour les prédicats est ce qui fait que preceding::*[3] et (preceding::*)[3] ne renvoient pas la même chose. Mais c'est au terme de souffrances épouvantables éprouvées lors de séance de déboguage. :lol:Citation:
Envoyé par Erwy
Ca se justifie par les règles de production du langage :Citation:
Envoyé par Erwy
Ton expression (/A/B)[2]/(C[1]) matche la règle PathExpr. Si on la décompose, on a une FilterExpr - (/A/B)[2] - suivi du séparateur '/' et on devrait avoir en principe après un RelativeLocationPath ; or, (C[1]) est une PrimaryExpr, pas un RelativeLocationPath. C'est pour cela que l'expression est rejetée.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 [18] UnionExpr ::= PathExpr | UnionExpr '|' PathExpr [19] PathExpr ::= LocationPath | FilterExpr | FilterExpr '/' RelativeLocationPath | FilterExpr '//' RelativeLocationPath [20] FilterExpr ::= PrimaryExpr | FilterExpr Predicate [15] PrimaryExpr ::= VariableReference | '(' Expr ')' | Literal | Number | FunctionCall
En meme temps c'est dans node-set() l'explication que je t'ai mise (mais c'est vrai que la traduction que j'ai aide bien) :lol: :wink:Citation:
Envoyé par GrandFather
Bon merci pour les parentheses je ne regarde pas assez cette p***n de grammaire :roll:
Ne vous battez pas, ne vous battez pas... ;)
Vous avez résolu mon problème. J'ai même eu un autre qui marche aussi très bien... grâce aux parenthèses 8)
Code:<xsl:for-each select="(item[@type])[position() <= 10]">
Et j'oubliais...
Merci! :D