Это часто задаваемые вопросы , почему
//someName[1]
не выбирает первый элемент //someName
.
Глядя на theопределение //
сокращения , можно понять, что на самом деле
//someName[1]
эквивалентно :
/descendant-or-self::node()/someName[1]
и выбирается каждый элемент someName
, являющийся первым someName
дочерним элементом его родительского узла.
Таким образом, если имеется два или более элементов someName
, которые являются первымиsomeName
дочерний элемент их родителей, все они выбраны.
Решение :
Вместо
//someName[1]
используйте :
(//someName)[1]
Итак, в вашем конкретном случае используйте :
(//div[@class='abc']//a[contains(@href,'def')]) [1]
Кроме этого , ни один извышеприведенные выражения будут выбирать любой узел, если в реальном документе XML было указано пространство имен по умолчанию.Выбор узлов в документе с пространством имен по умолчанию является самым большим XPath FAQ.Чтобы найти решение, просто найдите «пространство имен по умолчанию» в этом теге SO и в любом месте в Интернете.