Comment obtenir l'élément N supérieur correspondant à une condition avec xpath
Question
J'ai un XML comme ça
<root>
<el id="1" value="3"/>
<el id="2" value="3"/>
<el id="3" value="4"/>
<el id="4" value="4"/>
<el id="5" value="4"/>
<el id="6" value="4"/>
</root>
J'aimerais avec un XPath (je suis dans le contexte AC # pas un modèle XSLT) Obtenez le 2 premier élément avec une valeur de 4 IE
<el id="3" value="4"/>
<el id="4" value="4"/>
avec /root/el[position() <= 2 and @value=4]
J'obtiendrais 0 élément car position () est basé sur le nœud parent, pas le sous-ensemble actuel.
Je peux le faire en C #, mais il semble inutile de charger 1200 nœuds alors que je n'en ai besoin que 20.
Merci
La solution
Ce qui suit fonctionne pour moi dans un script XSLT;
<xsl:template match="/">
<xsl:apply-templates select="/root/el[@value=4][position()<=2]" />
</xsl:template>
Le résultat est l'identifiant 3 et 4, donc le xpath /root/el[@value=4][position()<=2]
devrait fonctionner pour vous.
Autres conseils
La réponse de @RSP est correcte, mais j'aimerais ajouter une explication. Ce n'est pas toujours vrai que [cond1 and cond2]
est équivalent à [cond1][cond2]
. Vous avez besoin du deuxième formulaire.
Votre expression:
/root/el[position() <= 2 and @value=4]
... sélectionne tous el
des éléments qui ont un value
attribut égal à 4
et dont la position est inférieure ou égale à 2
. Il n'y a pas de tels éléments dans votre document.
Tu veux:
/root/el[@value=4][position() <= 2]
... qui sélectionne d'abord tous el
des éléments qui ont un value
attribut égal à 4
et alors filtre cette liste par position, comme vous le souhaitez.