Парни, я прекрасно знаю что такое предикаты, node-sets, context и т.д. И вполне себе понимаю разницу между (//h3)[2] и //h3[2].
По производительности: давайте я "откомпилирую" эти выражения
1. //select[@id='country']/option[1] - браузер серчит DOM с начала, находит <select id='country'>, берет первый чайлд <option>, применяет к нему предикат [position()=1], получает тру => искомый элемент найдет => коней
2. (//select[@id='country']/option)[1] - браузер серчит DOM с начала, находит <select id='country'>, собирает *всех* чайлдов <option> (которые нам абсолютно не нужны), и идет гулять дальше по DOM выискивая новых кандидатов.
Какой вариант будет быстрее? Подсказка - select с 100К опциями во втором варианте отправил Opera'у в нокаут минут на 20.
По "счастливому стечению обстоятельств" и стабильности:
//select[@id='country']/option[1] - я точно знаю, что ищу: опцию в селекте, которая является первым чайлдом.
1. Если у селекта первый чайлд не option (optgroup во внимание не берем) - это баг => тест должен упасть.
2. Если имеет место быть
<select id='county'>
<option>1</option>
</select>
<select id='county'>
<option>3</option>
</select>
То //select/option[2] приведет к вполне ожидаемому фейлу, при(//select[@id='county')[2] выберет первое значение второго селекта, что не совсем ответствует ожиданиям.