这是HTML代码:
<div> <span></span> Elangovan </div>
我想基于其包含的文本为div
编写XPath。我试过了
//div[contains(text(),'Elangovan')]
但这不起作用。
答案 0 :(得分:20)
将text()
替换为string()
:
//div[contains(string(), "Elangovan")]
或者,您可以检查以下文本同级的span
是否包含文本:
//div[contains(span/following-sibling::text(), "Elangovan")]
另见:
答案 1 :(得分:8)
除了alecxe的正确答案(+1)之外,以下稍微简单且稍微惯用的XPath将以相同的方式工作:
//div[contains(., "Elangovan")]
{* 3}}原始XPath不起作用的原因是 text()
将选择div
的所有文本节点子项。但是,contains()
在其第一个参数中需要一个字符串,并且当给定一组节点文本节点时,它只使用第一个。这里,第一个文本节点包含空格,而不是搜索到的字符串,因此测试失败。使用隐式.
或显式text()
第一个参数,所有文本节点后代在执行contains()
测试之前连接在一起,因此测试通过。
答案 2 :(得分:1)
为了让@ kjhughes的答案更准确一点,你真正要求的是一种在div
{{.
{{{{{{{{ 3}}:
对于每种类型的节点,都有一种确定字符串值的方法 对于该类型的节点。对于某些类型的节点,字符串值为 节点的一部分;对于其他类型的节点,字符串值为 从后代节点的字符串值计算。
上下文节点(div
或text()
本身)和contains
返回的节点集 - 或任何其他参数! - 传递给{{1}}时首先转换为字符串。它只是以不同的方式进行转换,因为一个引用单个元素而另一个引用节点集。
单个元素的字符串值是其所有文本节点后代的字符串值的串联。另一方面,节点集的字符串值是集合中节点中首先按文档顺序排列的节点的字符串值。
因此,真正的区别在于您转换为字符串以及转换的方式。