Насколько я понимаю вопрос и предоставленный XML-документ заключается в том, что ближайший атрибут id
может также встречаться с элементом-предком (section
) .
В любом такомесли выражения, использующие только ось preceding::
(как указано в других ответах на этот вопрос), не выбирают ни одного узла.
Одно правильное выражение XPath, которое выбирает атрибут требуемого id
is :
(//bookmark/ancestor::*[@id][1]/@id
|
//bookmark/preceding::*[@id][1]/@id
)
[last()]
Если атрибут id
также разрешен для самого элемента bookmark
, приведенное выше выражение XPath необходимо слегка изменить, чтобы приспособить это:
(//bookmark/ancestor-or-self::*[@id][1]/@id
|
//bookmark/preceding::*[@id][1]/@id
)
[last()]
Примечание: Оси ancestor::
и preceding::
не пересекаются (не перекрываются).