我觉得我缺少一些基本的东西,但是我无法弄清楚。给定这个xml:
<p>
<tag>good text</tag>
<tag>this may be good </tag>
bad text
<tag>some other bad text</tag>
<tag>last good text</tag>
</p>
我想选择除文本节点(
bad text
)和紧随其后的标记节点之外的所有内容。显然,优质标签和独立文本节点的数量各不相同,因此我不能依靠它们的绝对位置。我知道
p/text()
选择
bad text
并//p/*
选择所有
p
子级,但不包括bad text
。但是在此示例中,我无法弄清楚如何仅以第一个,第二个和第四个标签结尾。所需的输出:
<p>
<tag>good text</tag>
<tag>this may be good</tag>
<tag>last good text</tag>
</p>
最佳答案
此XPath 1.0表达式:
/p/*[not(preceding-sibling::node()[1][normalize-space(self::text())='bad text'])]
它选择:
<tag>good text</tag>
<tag>this may be good or bad</tag>
<tag>last good text</tag>
含义:
选择
p
的子元素,该元素不具有第一个在前节点,即带有“坏文本”字符串的文本节点作为空间归一化字符串值。检查:http://www.xpathtester.com/xpath/96aa0415f3512b0a84ad1e2330e0278f
关于xpath - 如何排除文本节点周围的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101363/