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

使用XPath,如何获取不属于超链接的文本节点,xpath,Xpath,我希望获取文档的所有文本节点,但仅获取不属于超链接的文本节点 测试样本: Hello <a class='foobar' href='foo.html'>foo</a>World Hello foo World 结果文本节点应包括包含Hello foo World的文本节点,但不包括超链接 我试过了//*[not@href]/文本,但这似乎不起作用 更新 正如我下面的回答所希望解释的,我的问题是查询查找的是根节点内部的节点,而不是根节点本身。我的答案如下 安德鲁想出了一

我希望获取文档的所有文本节点,但仅获取不属于超链接的文本节点

测试样本:

Hello <a class='foobar' href='foo.html'>foo</a>World Hello foo World
结果文本节点应包括包含Hello foo World的文本节点,但不包括超链接

我试过了//*[not@href]/文本,但这似乎不起作用

更新

正如我下面的回答所希望解释的,我的问题是查询查找的是根节点内部的节点,而不是根节点本身。我的答案如下


安德鲁想出了一个不同的方法,可能更清楚地表明了他的意图。

好的,一个灯泡突然亮了起来。我想要任何节点中的文本,包括根节点。正确答案是:

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

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

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

你也可以排除父母,我认为这是你之前所想的,但你需要稍后再排除,在这种情况下,速记法似乎不起作用:

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

你也可以排除父母,我认为这是你之前所想的,但你需要稍后再排除,在这种情况下,速记法似乎不起作用:

//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
使用:

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

使用:


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

+1 for xpath util,在回答此问题之前,我不知道它是否存在。非常感谢你!它在opensuse中的werken xpath包中,似乎来自-老实说,我之所以使用它,是因为我不能让saxon按照我想要的方式快速工作,opensuse将它列为xpath util的替代品…+1,直到这个答案我才知道它的存在。非常感谢你!它在opensuse中的werken xpath包中,似乎来自-老实说,我之所以使用它,是因为我不能让saxon按照我想要的方式快速工作,opensuse将它列为一种替代方案。。。