Ahora que miro de nuevo a esta pregunta, creo que el verdadero problema no está en la iteración , pero en el uso de //
.
Este es un FAQ:
//p[@class='myclass'][1]
selecciona cadap
elemento que tiene un atributo con el valor class
"myclass"
y que es el primero de estos hijo de su padre. Por lo tanto, esta expresión puede seleccionar muchos elementos p
, ninguno de los cuales es realmente el primer elemento p
en el documento.
Cuando queremos conseguir el primer p
elemento en el documento que satisfaga el predicado anteriormente, una expresión correcta es:
(//p)[@class='myclass'][1]
Recuerde: El operador []
tiene mayor prioridad (precedencia) que la //
abreviatura. Cuando necesite indexar los nodos seleccionados por //
, coloque siempre la expresión entre los paréntesis.
Aquí es una demostración:
<nums>
<a>
<n x="1"/>
<n x="2"/>
<n x="3"/>
<n x="4"/>
</a>
<b>
<n x="5"/>
<n x="6"/>
<n x="7"/>
<n x="8"/>
</b>
</nums>
La expresión XPath:
//n[@x mod 2 = 0][1]
selecciona los siguientes dos nodos:
<n x="2" />
<n x="6" />
La expresión XPath:
(//n)[@x mod 2 = 0][1]
selecciona exactamente el primer n
elemento en el documento con la propiedad deseada:
<n x="2" />
probar este primero con la siguiente transformación:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="//n[@x mod 2 = 0][1]"/>
</xsl:template>
</xsl:stylesheet>
y el resultado son dos nodos.
<n x="2" />
<n x="6" />
Ahora, cambiar la expresión XPath que a continuación y vuelve a intentarlo:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="(//n)[@x mod 2 = 0][1]"/>
</xsl:template>
</xsl:stylesheet>
y el resultado es lo que realmente queríamos - la primera n
elemento en el documento:
<n x="2" />
Buena pregunta (+1). Consulte mi respuesta para obtener una explicación y un ejemplo de iteración en un conjunto de nodos seleccionado por una expresión XPath. –
La pregunta no está realmente completa. ¿Qué tecnología/lenguaje estás usando para "procesar" tu página? ¿Qué es exactamente lo que quieres "iterar" en XPath? (XPath es un lenguaje de * selección *, no un lenguaje de * procesamiento *. La iteración como concepto no significa mucho aquí.) Explique. – Tomalak
@Gj puede ser útil mostrar el código Python o Selenium RC que intenta iterar a través del conjunto de nodos seleccionado por la expresión XPath. – LarsH