Как найти первую ссылку на странице, содержащей этот текст? - PullRequest
4 голосов
/ 26 декабря 2010

Если у меня есть две ссылки:

<div class="abc">
  <a id="def1" href="/definitely">Definitely 1</a>
  <a id="def2" href="/definitely">Definitely 2</a>    
</div>

И я хочу определить первое (def1), я думал, что это будет работать:

var linkXPath = "//div[@class='abc']//a[contains(@href,'def')][1]";

Но, похоже, нет.

Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 26 декабря 2010

Это часто задаваемые вопросы , почему

//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 и в любом месте в Интернете.

2 голосов
/ 26 декабря 2010

Ваше выражение XPath выбирает первый элемент a (с правой ссылкой) из каждый div (который имеет правильный класс), который содержит один. Таким образом, если существует два div с соответствующим, каждый с несколькими a элементами, которые соответствуют, вы получите набор повторов, содержащий два элемента: первый a в первом div и первый a во втором div.

Чтобы выбрать только первый элемент всего набора результатов, используйте круглые скобки, например, так:

(//div[@class='abc']//a[contains(@href,'def')])[1]

Кроме того, ваше выражение отлично работает для меня (проверено здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...