XML xpath, получить родительский элемент до определенного элемента

Я ищу правильный синтаксис xpath, чтобы получить конкретного родителя элемента. Пример:

root
   |- div
   |     |
   |     |----??? ---|
   |     |           |-a [class=1]
   |     |                      |- text[ A TEXT I DON'T WANT]
   |     |
   |     |
   |     |
   |     |-text[THE TEXT]
   |
   |-div 
   |    |-text[THE TEXT I DON'T WANT]
   |
   |-div 
   |    |-text[THE TEXT I DON'T WANT]

Я хочу получить текст «ТЕКСТ», но тот, который содержит a [class=1] внутри того же div. Что-то вроде этого:

//div//a[@class=1]/text[contains(.,'A TEXT')]/parent::*/parent::*.... <till div element>  /text

person Nir Bentzy    schedule 29.05.2011    source источник
comment
Хороший вопрос, +1. См. мой ответ для полного, точного, короткого и простого однострочного выражения XPath, которое выбирает именно нужный текстовый узел, вообще не используя какую-либо обратную ось :)   -  person Dimitre Novatchev    schedule 29.05.2011
comment
Проголосуйте за четкий и лаконичный вопрос.   -  person Robert Ross    schedule 09.05.2012


Ответы (2)


Учитывая XML

<?xml version="1.0"?>
<root>
    <foo id="id1">
        <foo id="i2">
            <baz/>
        </foo>
    </foo>
</root>

Вы можете найти ближайший предок элемента foo из baz, используя выражение XPath:

//baz/ancestor::foo[1]

Который выберет узел элемента foo с идентификатором «i2».

Итак, в вашем примере (если я правильно понимаю), как только вы получили нужный элемент «a», вы можете «создать резервную копию» дерева до ближайшего div-предка, добавив «/ancestor::div[1]» к вашему выражение.

person alexbrn    schedule 29.05.2011

Использование:

/root/div[.//a[@class='1']]/text()

Это выбирает любой текстовый узел, который является дочерним элементом любого элемента a, который имеет атрибут class со значением '1' и который (элемент a) является потомком любого элемента div, который является дочерним элементом верхнего элемента с именем root.

person Dimitre Novatchev    schedule 29.05.2011
comment
OP нужен «ТЕКСТ», ваше выражение получит «ТЕКСТ» - person Aleksey Otrubennikov; 16.11.2012
comment
Хорошее наблюдение - думаю, я не понял вопрос, когда отвечал на него год назад - исправлено сейчас. Пожалуйста, посмотрите и отмените свой отрицательный голос. - person Dimitre Novatchev; 16.11.2012