我想写这个问题的规范答案,因为上面的答案有问题。
我们的问题
CSS 选择器:
.foo
将选择具有类 foo 的任何元素。
如何在 XPath 中执行此操作?
尽管 XPath 比 CSS 更强大,但 XPath 没有 CSS 类选择器的本机等效项。但是,有一个解决方案。
正确的方法
XPath 中的等效选择器是:
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
函数规范化空格条带前空格和尾随空格(并且还用单个空格替换空格字符序列)。
(在更一般的意义上)这也相当于CSS选择器:
*[class~="foo"]
它将匹配其类属性值是空格分隔值列表的任何元素,其中一个值正好等于 foo。
几种明显但错误的方法
XPath 选择器:
//*[@class="foo"]
不起作用!因为它与具有多个类的元素不匹配,例如
<div class="foo bar">
如果类名周围有任何额外的空格,它也不匹配:
<div class=" foo ">
“改进的”XPath 选择器
//*[contains(@class, "foo")]
也不起作用!因为它错误地将元素与类 foobar 匹配,例如
<div class="foobar">
这要归功于这个家伙,他是我在网络上发现的这个问题的最早发表的解决方案:http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes-in-xpathxslt/