Consulta XPath para obtener la enésima instancia de un elemento

Resuelto rlandster asked hace 13 años • 2 respuestas

Hay un archivo HTML (cuyo contenido no controlo) que tiene varios inputelementos todos con el mismo atributo fijo idde "search_query". El contenido del archivo puede cambiar, pero sé que siempre quiero obtener el segundo inputelemento con el atributo id "search_query".

Necesito una expresión XPath para hacer esto. Lo intenté //input[@id="search_query"][2]pero eso no funciona. Aquí hay un ejemplo de cadena XML donde esta consulta falló:

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

Tenga en cuenta que lo anterior es simplemente un ejemplo y el otro código HTML puede ser bastante diferente y los inputelementos pueden aparecer en cualquier lugar sin una estructura de documento consistente (excepto que me garantiza que siempre habrá al menos dos inputelementos con un atributo de identificación de "search_query").

¿Cuál es la expresión XPath correcta?

rlandster avatar Oct 24 '10 14:10 rlandster
Aceptado

Esta es una pregunta frecuente :

//somexpression[$N]

significa "Encontrar cada nodo seleccionado por //somexpressionque sea el $Nenésimo hijo de su padre".

Lo que quieres es :

(//input[@id="search_query"])[2]

Recuerde : el []operador tiene mayor precedencia (prioridad) que la //abreviatura.

Dimitre Novatchev avatar Oct 24 '2010 15:10 Dimitre Novatchev

Esto parece funcionar:

/descendant::input[@id="search_query"][2]

Esto lo tomo de "Referencia del programador XSLT 2.0 y XPath 2.0, cuarta edición" de Michael Kay.

También hay una nota en la sección "Sintaxis abreviada" de la especificación del lenguaje de ruta XML http://www.w3.org/TR/xpath/#path-abbrev que proporciona una pista.

rlandster avatar Oct 24 '2010 15:10 rlandster