Я хочу написати канонічну відповідь на це питання, оскільки відповідь вище має проблему.
Наша проблема
CSS селектор:
.foo
вибере будь-який елемент, що має клас foo .
Як це зробити в XPath?
Хоча XPath є потужнішим за CSS, XPath не має власного еквівалента селектора класу CSS . Однак рішення є.
Правильний спосіб це зробити
Еквівалентний селектор у XPath :
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
Функція normalize-space знімає пробіли, що ведуть та відстають (а також замінює послідовності пробілів на один пробіл).
(У більш загальному розумінні) це також еквівалент селектора 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 /