Как вы пытались прикрепить last ()? Я думаю, что это должно работать:
/container/container/ancestor-or-self::container/data[@id="1"][last()]
EDIT:
Правильно, конечно, я забыл скобки:
(/container/container/ancestor-or-self::container/data[@id="1"])[last()]
Что делает это так же, как один из других ответов; однако, как указывает оригинальный плакат, это выражение не выполняется:
<container value="">
<container>
<data id="1">a3</data>
<data id="3">a4</data>
</container>
<data id="1">a1</data>
<data id="2">a2</data>
</container>
В соответствии с духом stackoverflow, однако, я могу объединить свой ответ с одним из других ответов и получить что-то, что работает во всех случаях:
(/container/container/ancestor-or-self::container[data[@id="1"]])[last()]/data[@id="1"]
Кстати, если в одном контейнере есть несколько дочерних элементов @ id-is-1 , все они будут возвращены. Чтобы вернуть только первый такой элемент:
(/container/container/ancestor-or-self::container[data[@id="1"]])[last()]/data[@id="1"][1]