.和之间存在差异text(),但是由于您输入的文档,这种差异可能不会浮出水面。
如果您的输入文档看起来像(给定您的XPath表达式可以想象的最简单的文档)
例子1
<html>
<a>Ask Question</a>
</html>
然后//a[text()="Ask Question"],//a[.="Ask Question"]实际上返回完全相同的结果。但是考虑一个看起来像这样的输入文件
例子2
<html>
<a>Ask Question<other/>
</a>
</html>
其中该a元素还有一个子元素other,紧接在“问问题”之后。给定第二个输入文档,//a[text()="Ask Question"]仍然返回a元素,而//a[.="Ask Question"]什么都不返回!
这是因为两个谓词([和之间的所有内容])的含义不同。[text()="Ask Question"]实际上意味着:如果一个元素的任何文本节点正好包含文本“问问题”,则返回true。另一方面,[.="Ask Question"]意味着:如果元素的字符串值与“问问题”相同,则返回true 。
在XPath模型中,如果其他元素干扰文本,则可以将XML元素内的文本划分为多个文本节点,如上面的示例2所示。在那里,other元素位于“问问题”和换行符之间,换行符也视为文本内容。
为了使示例更清晰,请考虑将其作为输入文档:
例子3
<a>Ask Question<other/>more text</a>
在这里,a元素实际上包含两个文本节点“问问题”和“更多文本”,因为它们都是的直接子代a。您可以通过//a/text()在此文档上运行进行测试,该文档将返回(各个结果以分隔----):
Ask Question
-----------------------
more text
因此,在这种情况下,text()将返回一组单独的节点,同时.在谓词中评估所有文本节点的字符串串联。同样,您可以使用路径表达式测试此声明,该表达式//a[.='Ask Questionmore text']将成功返回a元素。
最后,请记住,某些XPath函数只能将一个字符串作为输入。正如LarsH在评论中指出的那样,如果为这样的XPath函数(例如contains())提供了一系列节点,则它将仅处理第一个节点,而忽略其余节点。
text(),它选择一个文本节点,和使用一个比较通用的节点选择器(例如.)之间的区别。