Используя XPath, Как мне получить текстовые узлы, которые не являются частью гиперссылок? - PullRequest
1 голос
/ 06 марта 2012

Я хотел бы получить все текстовые узлы документа, но только те, которые НЕ являются частью гиперссылки.

Тестовый образец:

Hello <a class='foobar' href='foo.html'>foo</a>World Hello foo World

Результирующие текстовые узлы должны включать текстовый узел с Hello foo World, но не гиперссылку.

Я пытался "//*[not(@href)]/text()", но это не похоже на работу.

UPDATE

Как объясняет мой ответ ниже (надеюсь), моя проблема заключалась в том, что запрос искал узлы внутри корневого узла, но не сам корневой узел. Мой ответ ниже.

Эндрю предложил другой подход, который, вероятно, более ясен в отношении намерений.

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

вы также можете исключить родителей (о чем я думаю, вы думали раньше?), Но вы должны поместить исключение позже (и сокращенная запись, кажется, не работает в этом контексте):

//text()[not(parent::a)]

например:

> cat foo.xml 
<b>
<a href="href">baz</a>
text
<c>foo<a href="href">bar</a>here</c>
more
</b>

> xpath foo.xml "//text()[not(parent::a)]"
Found 5 nodes:
-- NODE --

-- NODE --

text
-- NODE --
foo-- NODE --
here-- NODE --

more
2 голосов
/ 06 марта 2012

ОК, лампочка зажглась. Я хотел, чтобы текст был внутри любого узла, включая корневой узел. Правильный ответ:

//*[not(@href)]/text() | /text()
1 голос
/ 06 марта 2012

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

//text()[not(ancestor::a)]

Выбирает любой текстовый узел, который не является потомком элемента a.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...