Чтобы перейти к любому <ITEM>
, этого достаточно.
//ITEM
Теперь <EFFECT>
- это брат <ITEM>
, то есть он находится на том же уровне.Другой способ думать о братьях и сестрах - это то, что они являются потомками одного и того же родителя.
Фактически, все рассматриваемые элементы <EFFECT>
являются потомками какого-то предка <ITEM>
.Это означает, что мы можем двигаться вверх вдоль оси ancestor::
и захватить все элементы-предки за один шаг:
//ITEM/ancestor::*
Это даст нам <parent>
, <parent2>
и <root>
в этом порядке.
И из тех нам нужно сделать только один шаг вниз, чтобы захватить все <EFFECT>
элементов:
//ITEM/ancestor::*/EFFECT
Это даст нам три EFFECT
элементов, на этот раз снова в порядке документа (только ось типа ancestor::
работает наизнанку).
Нас интересует последний из них, потому что он будет наиболее близок к <ITEM>
, с которого мы начали.Функция last()
поможет здесь:
(//ITEM/ancestor::*/EFFECT)[last()]
Круглые скобки вокруг пути необходимы, потому что в противном случае условие ([last()]
) проверяется на каждом <EFFECT>
в отдельности, и каждое из них являетсяпоследний в своем роде для своего родителя, давая нам три матча.Скобки делают так, что сначала создается набор узлов из трех <EFFECT>
элементов, а , а затем - последний, что дает нам только одно совпадение.
Когда вы уже в данный момент находитесьв элементе <ITEM>
относительная версия пути выбирает последний эффект для этого конкретного элемента:
(ancestor::*/EFFECT)[last()]