使用XPath,如何获取不属于超链接的文本节点

时间:2012-03-05 21:24:17

标签: xpath

我想获取文档的所有文本节点,但只能获取不属于超链接的文本节点。

测试样本:

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

结果文本节点应包含带有Hello foo World的文本节点,但不包括超链接。

我尝试了"//*[not(@href)]/text()",但这似乎不起作用。

更新

正如我的答案(希望)解释的那样,我的问题是查询是在根节点内寻找节点,而不是根节点本身。我的答案如下。

安德鲁提出了一种不同的方法,可能更明确意图。

3 个答案:

答案 0 :(得分:3)

你也可以排除父母(我认为你之前想到的是什么?),但是你需要稍后进行排除(并且简写符号在这种情况下似乎不起作用):

//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

答案 1 :(得分:2)

好的,一个灯泡弹了。我想要任何节点内的文本,包括根节点。正确的答案是:

//*[not(@href)]/text() | /text()

答案 2 :(得分:1)

使用

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

这将选择不是a元素的后代的任何文本节点。