Как выбрать последний элемент XHTML <span>с определенным классом в XPath? - PullRequest
1 голос
/ 27 декабря 2010

Мой целевой документ XHTML (упрощенный) выглядит следующим образом:

<html>
<head>
</head>
<body>
<span class="boris"> </span>
<span class="boris"> </span>
<span class="johnson"> </span>
</body>
</html>

Я пытаюсь выбрать последний из класса "boris".

Выражение XPath

//span[@class="boris"]

выбирает все промежутки класса boris.Как выбрать последний из них?

Я пробовал

//span[@class="boris" and last()]

, который не работает, потому что last () здесь относится к последнему промежутку в ВСЕХ ДОКУМЕНТАХ.

Как выбрать все промежутки класса boris ... и затем последний из них?

Я прочитал 5 или 6 уроков по XPath и сделал много поисков, и я могуне могу найти способ сделать это только в XPath: (

Заранее спасибо за помощь:)

Ответы [ 2 ]

3 голосов
/ 27 декабря 2010
(//span[@class="boris"])[last()]

Паренсы необходимы, чтобы last() работал так, как вы хотите. Это:

//span[@class="boris"][last()]

неверно, потому что он выбрал бы несколько <span class="boris">, если бы они были последними в своем роде у своих родителей:

<div>
  <span class="boris">#1</span><!-- this one -->
</div>
<div>
  <span class="boris">#2</span><!-- this one not -->
  <span class="boris">#3</span><!-- but this -->
</div>
<div>
  <span class="boris">#4</span><!-- and this, too -->
  <span class="other">#5</span><!-- this not -->
</div>

Первое выражение выберет только одно: # 4. Это тот, который вам нужен.

Второе выражение выбирает # 1, # 3 и # 4, как показано.


Ваша попытка (//span[@class="boris" and last()]) выберет каждые <span class="boris">, но главным образом потому, что вы ошиблись: last() оценивает число. И любое число, отличное от 0, оценивается как true в логическом контексте. Это означает, что выражение никогда не может быть false для <span class="boris">.

Вы должны сделать правильное сравнение для логического: Что вы имели в виду было

//span[@class="boris" and position() = last()]

что все еще неправильно, хотя. Он выбирает # 1 и # 3, потому что здесь и position() и last() считаются в родительском элементе.

Когда вы используете () parens, вы создаете новый временный набор узлов, и last() может работать с этим.

0 голосов
/ 27 декабря 2010

Просто угадай здесь, но не так ли //span[@class="boris"][last()]?

EDIT:

Я только что видел, что вы также можете вкладывать предикаты (см. здесь ), поэтому, возможно, вы можете сделать: //span[@class="boris"[last()]]

РЕДАКТИРОВАТЬ 2:

Нет, это не работает. Перейти с первым. Кстати, я попробовал ваш and last() онлайн, и он, казалось, делал то, что вы хотели. Да.

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