Requête XPath pour obtenir la nième instance d’un élément

Il y a un fichier HTML (dont je ne contrôle pas le contenu) qui possède plusieurs éléments d’ input , tous avec le même atsortingbut d’ id fixe de "search_query" . Le contenu du fichier peut changer, mais je sais que je veux toujours obtenir le deuxième élément d’ input avec l’atsortingbut id "search_query" .

J’ai besoin d’une expression XPath pour ce faire. J’ai essayé //input[@id="search_query"][2] mais cela ne fonctionne pas. Voici un exemple de chaîne XML où cette requête a échoué:

 

Gardez à l’esprit que ce qui précède est simplement un exemple et que l’autre code HTML peut être très différent et que les éléments d’ input peuvent apparaître n’importe où sans structure de document cohérente (sauf que je suis assuré qu’il y aura toujours au moins deux éléments d’ input avec un identifiant) atsortingbut de "search_query" ).

Quelle est la bonne expression XPath?

Ceci est une FAQ :

//somexpression[$N]

signifie “Trouver chaque noeud sélectionné par //somexpression qui est le $N enfant de son parent”.

Ce que vous voulez c’est :

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

Rappelezvous que l’ opérateur [] a une priorité (priorité) supérieure à l’abréviation // .

Cela semble fonctionner:

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

Je vais à partir de “XSLT 2.0 et XPath 2.0 Programmer’s Reference, 4ème édition” de Michael Kay.

Il y a aussi une note dans la section “Syntaxe abrégée” de la spécification du langage XML Path http://www.w3.org/TR/xpath/#path-abbrev qui fournit un indice.