Cómo llegar a la CIMA N elemento correspondiente a una condición con XPath
Pregunta
Tengo un XML como este
<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>
Me gustaría con una xpath (estoy en un c# contexto de una plantilla xslt) se obtiene el 2 primer elemento con un valor de 4 ie
<el id="3" value="4"/>
<el id="4" value="4"/>
con /root/el[position() <= 2 and @value=4]
Me gustaría obtener 0 elemento debido a la posición() se basa en el nodo padre, y no el actual subconjunto.
Puedo hacer esto en c#, pero parece inútil carga de 1200 nodo cuando solo necesito 20.
Gracias
Solución
Las siguientes obras para mí en una secuencia de comandos XSLT;
<xsl:template match="/">
<xsl:apply-templates select="/root/el[@value=4][position()<=2]" />
</xsl:template>
El resultado es id 3 y 4, por lo que el XPATH /root/el[@value=4][position()<=2]
debe trabajar para usted.
Otros consejos
La respuesta de @rsp es correcta, pero me gustaría agregar una explicación.No siempre es cierto que [cond1 and cond2]
es equivalente a [cond1][cond2]
.Necesita el segundo formulario.
Tu expresión:
/root/el[position() <= 2 and @value=4]
... selecciona todos los elementos el
que tienen un atributo value
igual a 4
y cuya posición es menor o igual que 2
.No hay tales elementos en su documento.
Quieres:
/root/el[@value=4][position() <= 2]
... que primero selecciona todos los elementos el
que tienen un atributo value
igual a 4
y luego filtra esa lista por posición, según se desee.