Я хочу написать канонический ответ на этот вопрос, потому что в приведенном выше ответе есть проблема.
Наша проблема
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 /