如何排除文本节点周围的节点?

时间:2019-07-18 19:19:55

标签: xpath

我觉得我缺少一些基本知识,但我无法弄清楚;给定这个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>

1 个答案:

答案 0 :(得分:2)

此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