如果它是文本节点,如何使用Xpath选择特定节点?

时间:2014-08-16 06:26:54

标签: xpath

我正在尝试选择第二个node(),但仅当是文本节点时才会选择。

<p><span>Span text</span> plain text</p>

我已经尝试了/p/node()[2]/text(),但这不起作用,因为第二个节点内没有文本节点 /p/node()[1]/text()提供'Span text'/p/text()[1]提供' plain text',但它应该使用[2]而不是[1]。在选择节点后,我无法确定如何指定文本谓词。

我想要的结果是:

NodeList {
  length => 2,
  0 => Node('<span>Span text</span>'),
  1 => Text(' plain text')
}

其中第一个节点必须span,第二个节点必须仅为文本。最好不要有任何其他节点,所以如果有两个以上的节点不匹配任何东西,如果缺少文本节点,它应该与span节点不匹配。

/p/node()[1]|/p/node()[2]在输入良好时返回我想要的内容,但它也会返回超出我要求的匹配项。 e.g:

<p>Bad match <span>Span text</span> plain text</p>

会将'Bad match '作为node()[1]返回。此无效匹配示例应返回以下内容:

NodeList {
  length => 0
}

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

/p[node()[2] = text()]

这将选择<p>,其中第二个子节点等于文本子节点。然后,您可以通过选择<p>的任何所需子项继续路径,例如:

/p[node()[2] = text()]/node()[1]|/p[node()[2] = text()]/node()[2]