(//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()
может работать с этим.