2013-05-08 5 views
5

XPath jest //div[contains(@class, 'a b') and not (contains(@style, 'c'))]Css selektor odpowiednik '// div [zawiera (@class 'z B'), a nie (zawiera (@style, 'C'))]'

co byłoby równoważne CSS selektor być? Łatwo uzyskać pierwszy bit div[class*='a b'], ale jak je negować i łączyć?

+2

Jak @BoltClock zakłada w swoim komentarzu do użytkownika @ BenjaminGruenbaum odpowiedź, twój 'contains (@class 'a b')' jest chyba źle, bo to pasuje do ' class = 'da bd''. Poprawny XPath dla tego jest 'zawiera (concat ('', @ klasa, ''), 'a b')'. –

+0

Ma sens. Czy też "div [class * = 'a b']' match 'class = 'da bd'' również? Więc jaki jest równoważny selektor css do 'zawiera (concat ('', @ class, ''), 'a b')'? –

+1

@ user1177636: Tak. Odpowiednikiem tego jest '.a.b'. – BoltClock

Odpowiedz

7

możliwość neguje pomocą wybieraka :not() i inny selektor atrybutu dla atrybutu style. Aby je połączyć, wystarczy dołączyć :not() do końca tego, co już masz.

Równowartość selektor CSS byłoby

div[class*='a b']:not([style*='c']) 
5

Chcesz wybrać div elementy z obu klas a i b można użyć div.a.b.

Jeśli chcesz to nie zawiera atrybutu stylu z wartości c można użyć:

div.a.b:not([style*=c]) 
+0

Dzięki, spróbuję. Czy "div.a.b: not ([style * = c])" i "div [class * = 'a b']: not ([style * = c])" odpowiednik? Czy kolejność nazw klas ma znaczenie w niektórych przypadkach dziwnych? –

+0

Takie przypadki wcale nie są dziwne :) –

+0

@ user1177636: Nie, nie są one równoważne. 'div.ab' pasuje tylko do klas' a' i 'b', podczas gdy' div [class * = 'a b'] 'pasuje do zestawu dwóch klas, z których pierwsza kończy się na' a', a druga zaczyna z 'b'. Oznacza to, że podczas dopasowywania 'b b' będzie także pasować coś w stylu' ba bb'. Jeśli naprawdę chcesz ścisłego odpowiednika 'zawiera (@class, 'a b')', a nie tylko pasujące '.a.b', użyj selektora atrybutu. Kolejność nazw klas w atrybucie "klasa" nie ma znaczenia, ale jeśli użyjesz selektora atrybutu, może to trochę zepsuć. – BoltClock

Powiązane problemy