Bu soruya kanonik cevabı yazmak istiyorum çünkü yukarıdaki cevabın bir problemi var.
Bizim problemimiz
CSS seçici:
.foo
foo sınıfına sahip herhangi bir öğeyi seçecektir .
Bunu XPath'te nasıl yaparsınız?
XPath, CSS'den daha güçlü olmasına rağmen, XPath'in CSS sınıf seçicisinin yerel eşdeğeri yoktur . Ancak bir çözüm var.
Bunu yapmanın doğru yolu
XPath'deki eşdeğer seçici :
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
Normalize-space işlevi, beyaz boşluğun başındaki ve sonundaki boşlukları şeritler (ve ayrıca boşluk karakterleri dizilerini tek bir boşlukla değiştirir).
(Daha genel anlamda) bu aynı zamanda CSS seçicinin eşdeğeridir:
*[class~="foo"]
sınıf öznitelik değeri boşluklarla ayrılmış değerler listesi olan herhangi bir elemanla eşleşir , bunlardan biri foo'ya tam olarak eşittir .
Birkaç bariz, ancak bunu yapmanın yanlış yolları
XPath seçici:
//*[@class="foo"]
çalışmıyor! çünkü birden fazla sınıfa sahip bir öğeyle eşleşmez, örneğin
<div class="foo bar">
Sınıf adının çevresinde fazladan boşluk varsa da eşleşmez:
<div class=" foo ">
'Gelişmiş' XPath seçici
//*[contains(@class, "foo")]
da çalışmıyor! çünkü öğeleri sınıf foobarıyla yanlış bir şekilde eşleştiriyor , örneğin
<div class="foobar">
Kredi, web'de bulduğum bu soruna en erken yayınlanan çözüm olan bu adama gidiyor:
http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- in-xpathxslt /