Comment obtenir l'élément N supérieur correspondant à une condition avec xpath

StackOverflow https://stackoverflow.com/questions/5899372

  •  29-10-2019
  •  | 
  •  

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

Était-ce utile?

La solution

Ce qui suit fonctionne pour moi dans un script XSLT;

  <xsl:template match="/">
    <xsl:apply-templates select="/root/el[@value=4][position()&lt;=2]" />
  </xsl:template>

Le résultat est l'identifiant 3 et 4, donc le xpath /root/el[@value=4][position()&lt;=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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top