Tôi muốn viết câu trả lời chính tắc cho câu hỏi này vì câu trả lời ở trên có vấn đề.
Vấn đề của chúng ta
Bộ chọn CSS :
.foo
sẽ chọn bất kỳ phần tử nào có lớp foo .
Làm thế nào để bạn làm điều này trong XPath?
Mặc dù XPath mạnh hơn CSS, XPath không có công cụ chọn lớp CSS tương đương với bản gốc . Tuy nhiên, có một giải pháp.
Đúng cách để làm điều đó
Bộ chọn tương đương trong XPath là:
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
Hàm normalize-space dải khoảng trắng đầu và cuối (và cũng thay thế chuỗi ký tự khoảng trắng bằng một khoảng trắng).
(Theo nghĩa chung hơn) đây cũng tương đương với bộ chọn CSS:
*[class~="foo"]
sẽ khớp với bất kỳ phần tử nào có giá trị thuộc tính lớp là danh sách các giá trị được phân tách bằng khoảng trắng, một trong số đó chính xác bằng foo .
Một vài cách hiển nhiên, nhưng sai để làm điều đó
Bộ chọn XPath:
//*[@class="foo"]
không hoạt động! vì nó sẽ không khớp với một phần tử có nhiều hơn một lớp, chẳng hạn
<div class="foo bar">
Nó cũng sẽ không khớp nếu có thêm bất kỳ khoảng trắng nào xung quanh tên lớp:
<div class=" foo ">
Bộ chọn XPath 'cải tiến'
//*[contains(@class, "foo")]
cũng không hoạt động! vì nó đối sánh sai các phần tử với foobar lớp , chẳng hạn
<div class="foobar">
Tín dụng thuộc về anh bạn này, người là giải pháp được công bố sớm nhất cho vấn đề này mà tôi tìm thấy trên web:
http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- in-xpathxslt /