我正在尝试选择第二个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
}
答案 0 :(得分:1)
这样的事情怎么样:
/p[node()[2] = text()]
这将选择<p>
,其中第二个子节点等于文本子节点。然后,您可以通过选择<p>
的任何所需子项继续路径,例如:
/p[node()[2] = text()]/node()[1]|/p[node()[2] = text()]/node()[2]