Test results:

Passed: 1245

Not valid: 1

Have no matches: 113

Coverter errors: 7

Info:

All tests are run in Puppeteer.

Tests Passed mean that the elements selected by CSS selector are reference equal (not just only by count) to the elements selected by the generated XPath.

Note that XPath implementation for the class attribute is the standard one (like other attributes).

CssSelector.json

Results:

Passed: 51

Not valid: 1

Have no matches: 13

Coverter errors: 2

Passed: 51

* 89 === 89 .//*

body 1 === 1 .//body

p > * 3 === 3 .//p/*

#myDiv 1 === 1 .//*[@id='myDiv']

*:empty 21 === 21 .//*[not(*) and not(text())]

div p a 1 === 1 .//div//p//a

div > p 9 === 9 .//div/p

div[id] 2 === 2 .//div[@id]

#myDiv * 5 === 5 .//*[@id='myDiv']//*

#myDiv>* 2 === 2 .//*[@id='myDiv']/*

.checkit 2 === 2 .//*[contains(concat(' ', normalize-space(@class), ' '), ' checkit ')]

p.ohyeah 1 === 1 .//p[contains(concat(' ', normalize-space(@class), ' '), ' ohyeah ')]

a + span 1 === 1 .//a/following-sibling::*[1]/self::span

#-a-b-c- 1 === 1 .//*[@id='-a-b-c-']

div#myDiv 1 === 1 .//div[@id='myDiv']

div:has(p) 9 === 9 .//div[count(.//p) > 0]

p:has(+ p) 2 === 2 .//p[count(following-sibling::*[1]/self::p) > 0]

div ~ form 1 === 1 .//div/following-sibling::form

p.hiclass,a 4 === 4 .//p[contains(concat(' ', normalize-space(@class), ' '), ' hiclass ')] | .//a

.omg.ohyeah 1 === 1 .//*[contains(concat(' ', normalize-space(@class), ' '), ' omg ') and contains(concat(' ', normalize-space(@class), ' '), ' ohyeah ')]

div .ohyeah 1 === 1 .//div//*[contains(concat(' ', normalize-space(@class), ' '), ' ohyeah ')]

div > * > * 9 === 9 .//div/*/*

div:has(> p) 7 === 7 .//div[count(child::p) > 0]

*:last-child 37 === 37 .//*[not(following-sibling::*)]

p:last-child 7 === 7 .//p[not(following-sibling::*)]

*:only-child 25 === 25 .//*[not(preceding-sibling::*) and not(following-sibling::*)]

p:only-child 4 === 4 .//p[not(preceding-sibling::*) and not(following-sibling::*)]

*[class$=it] 2 === 2 .//*[substring(@class, string-length(@class) - (string-length('it') - 1)) = 'it']

*:first-child 37 === 37 .//*[not(preceding-sibling::*)]

p:first-child 6 === 6 .//p[not(preceding-sibling::*)]

:nth-child(2) 12 === 12 .//*[position() = 2]/self::*

div:has(p + p) 3 === 3 .//div[count(.//p/following-sibling::*[1]/self::p) > 0]

*:nth-child(2) 12 === 12 .//*[position() = 2]/self::*

p:nth-child(2) 4 === 4 .//*[position() = 2]/self::p

div > p.ohyeah 1 === 1 .//div/p[contains(concat(' ', normalize-space(@class), ' '), ' ohyeah ')]

*[class*=heck] 2 === 2 .//*[contains(@class, 'heck')]

*[class^=check] 2 === 2 .//*[starts-with(@class, 'check')]

*:nth-child(-n+3) 54 === 54 .//*[position() <= 3]/self::*

a + span, div > p 10 === 10 .//a/following-sibling::*[1]/self::span | .//div/p

:nth-last-child(2) 12 === 12 .//*[count(following-sibling::*) = 1]

input[type='text'] 1 === 1 .//input[translate(@type, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('text', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

input[type='TEXT'] 1 === 1 .//input[translate(@type, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('TEXT', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

span:nth-child(even) 5 === 5 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::span

span:is(.this, .that) 3 === 3 .//span[contains(concat(' ', normalize-space(@class), ' '), ' this ') or contains(concat(' ', normalize-space(@class), ' '), ' that ')]

:is(div, section) > h1 4 === 4 .//*[self::div or self::section]/h1

span:nth-child(10n-1) 1 === 1 .//*[(count(preceding-sibling::*) + 2) mod 10 = 0]/self::span

span:nth-child(10n+1) 3 === 3 .//*[(count(preceding-sibling::*)) mod 10 = 0]/self::span

span:nth-last-child(2) 1 === 1 .//span[count(following-sibling::*) = 1]

#myDiv :nth-last-child(2) 2 === 2 .//*[@id='myDiv']//*[count(following-sibling::*) = 1]

section:not(:has(h1, h2, h3, h4, h5, h6)) 1 === 1 .//section[not(count(.//h1 | .//h2 | .//h3 | .//h4 | .//h5 | .//h6) > 0)]

section:has(:not(h1, h2, h3, h4, h5, h6)) 2 === 2 .//section[count(.//*[not(self::h1 | self::h2 | self::h3 | self::h4 | self::h5 | self::h6)]) > 0]

Not valid: 1

*:nth-child(-n+3 of span.this) CSS

Have no matches: 13

head p - 0 - .//head//p

#theBody #myDiv - 0 - .//*[@id='theBody']//*[@id='myDiv']

#theBody>#myDiv - 0 - .//*[@id='theBody']/*[@id='myDiv']

#someOtherDiv>* - 0 - .//*[@id='someOtherDiv']/*

input[id='text'] - 0 - .//input[@id='text']

input[id='TEXT'] - 0 - .//input[@id='TEXT']

span:nth-last-child(3) - 0 - .//span[count(following-sibling::*) = 2]

#theBody #whatwhatwhat - 0 - .//*[@id='theBody']//*[@id='whatwhatwhat']

#theBody>#someOtherDiv - 0 - .//*[@id='theBody']/*[@id='someOtherDiv']

span.this:nth-child(-n+3) - 0 - .//*[contains(concat(' ', normalize-space(@class), ' '), ' this ') and position() <= 3]/self::span

#whatwhatwhat #someOtherDiv - 0 - .//*[@id='whatwhatwhat']//*[@id='someOtherDiv']

dd:nth-child(1)>div:nth-child(3)>div:nth-child(1)>a - 0 - .//*[position() = 1]/self::dd/*[position() = 3]/self::div/*[position() = 1]/self::div/a

*[style*='display: none' i],*[style*='display:none' i] - 0 - .//*[contains(translate(@style, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('display: none', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))] | .//*[contains(translate(@style, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('display:none', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

Coverter errors: 2

:scope > p converter error: Pseudo-class ':scope' is not implemented

span:nth-child(10n+-1) converter error: function parseFnNotation() - RegExp '/^([+-])?([0-9]+)?n(?:([+-])([0-9]+))?$/' failed to match the string 'span:nth-child(10n+-1)'

CssSelector2_test.html

Results:

Passed: 19

Have no matches: 16

Passed: 19

div 51 === 51 .//div

div p 140 === 140 .//div//p

div > p 134 === 134 .//div/p

div + p 22 === 22 .//div/following-sibling::*[1]/self::p

div ~ p 183 === 183 .//div/following-sibling::p

div p a 12 === 12 .//div//p//a

div, p, a 671 === 671 .//div | .//p | .//a

div[class] 51 === 51 .//div[@class]

p:only-child 3 === 3 .//p[not(preceding-sibling::*) and not(following-sibling::*)]

p:last-child 19 === 19 .//p[not(following-sibling::*)]

div[class*=e] 44 === 44 .//div[contains(@class, 'e')]

p:first-child 54 === 54 .//p[not(preceding-sibling::*)]

p:nth-child(n) 324 === 324 .//p

p:nth-child(2n) 158 === 158 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

p:nth-child(odd) 166 === 166 .//*[(count(preceding-sibling::*) + 1) mod 2 = 1]/self::p

div:not(.example) 51 === 51 .//div[not(contains(concat(' ', normalize-space(@class), ' '), ' example '))]

p:nth-child(even) 158 === 158 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

p:nth-child(2n+1) 166 === 166 .//*[(count(preceding-sibling::*)) mod 2 = 0]/self::p

a[href][lang][class] 1 === 1 .//a[@href and @lang and @class]

Have no matches: 16

.note - 0 - .//*[contains(concat(' ', normalize-space(@class), ' '), ' note ')]

#title - 0 - .//*[@id='title']

h1#title - 0 - .//h1[@id='title']

div #title - 0 - .//div//*[@id='title']

div.example - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' example ')]

ul .tocline2 - 0 - .//ul//*[contains(concat(' ', normalize-space(@class), ' '), ' tocline2 ')]

div[class^=exa] - 0 - .//div[starts-with(@class, 'exa')]

div[class$=mple] - 0 - .//div[substring(@class, string-length(@class) - (string-length('mple') - 1)) = 'mple']

ul.toc li.tocline2 - 0 - .//ul[contains(concat(' ', normalize-space(@class), ' '), ' toc ')]//li[contains(concat(' ', normalize-space(@class), ' '), ' tocline2 ')]

h1#title + div > p - 0 - .//h1[@id='title']/following-sibling::*[1]/self::div/p

div[class=example] - 0 - .//div[@class='example']

div[class|=dialog] - 0 - .//div[(@class = 'dialog' or starts-with(@class, 'dialog-'))]

div[class~=example] - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' example ')]

ul.toc > li.tocline2 - 0 - .//ul[contains(concat(' ', normalize-space(@class), ' '), ' toc ')]/li[contains(concat(' ', normalize-space(@class), ' '), ' tocline2 ')]

div.example, div.note - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' example ')] | .//div[contains(concat(' ', normalize-space(@class), ' '), ' note ')]

div[class^=exa][class$=mple] - 0 - .//div[starts-with(@class, 'exa') and substring(@class, string-length(@class) - (string-length('mple') - 1)) = 'mple']

CssToXPath.json

Results:

Passed: 98

Have no matches: 9

Passed: 98

* 133 === 133 .//*

ul 6 === 6 .//ul

:root 1 === 1 //ancestor-or-self::*[last()]

div, p 43 === 43 .//div | .//p

p:has(b) 2 === 2 .//p[count(.//b) > 0]

div:empty 1 === 1 .//div[not(*) and not(text())]

div.content 1 === 1 .//div[contains(concat(' ', normalize-space(@class), ' '), ' content ')]

p[class=p2] 3 === 3 .//p[@class='p2']

p[class^=p2] 6 === 6 .//p[starts-with(@class, 'p2')]

p[class$=p2] 4 === 4 .//p[substring(@class, string-length(@class) - (string-length('p2') - 1)) = 'p2']

p[class~=p2] 4 === 4 .//p[contains(concat(' ', normalize-space(@class), ' '), ' p2 ')]

p[class*=p2] 8 === 8 .//p[contains(@class, 'p2')]

p[class|=p2] 4 === 4 .//p[(@class = 'p2' or starts-with(@class, 'p2-'))]

body[lang|=EN] 1 === 1 .//body[(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('EN', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('EN', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

div:last-child 6 === 6 .//div[not(following-sibling::*)]

p:not(.c1) 21 === 21 .//p[not(contains(concat(' ', normalize-space(@class), ' '), ' c1 '))]

ul:first-child>li:not(.c1,.c2,.c6,.c7) 4 === 4 .//ul[not(preceding-sibling::*)]/li[not(self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c1 ')] | self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c2 ')] | self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c6 ')] | self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c7 ')])]

p:nth-child(3) 4 === 4 .//*[position() = 3]/self::p

div:first-child 5 === 5 .//div[not(preceding-sibling::*)]

body[lang|=En i] 1 === 1 .//body[(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('En', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('En', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

div>*:only-child 3 === 3 .//div/*[not(preceding-sibling::*) and not(following-sibling::*)]

p:nth-child(odd) 12 === 12 .//*[(count(preceding-sibling::*) + 1) mod 2 = 1]/self::p

p:nth-of-type(3) 3 === 3 .//p[count(preceding-sibling::p) = 2]

p:nth-child(even) 10 === 10 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

div[class|='has'] 1 === 1 .//div[(@class = 'has' or starts-with(@class, 'has-'))]

div[class*='s-t'] 1 === 1 .//div[contains(@class, 's-t')]

ul li:nth-child(3) 5 === 5 .//ul//*[position() = 3]/self::li

p:nth-of-type(odd) 14 === 14 .//p[(count(preceding-sibling::p) + 1) mod 2 = 1]

div[class^='has-'] 1 === 1 .//div[starts-with(@class, 'has-')]

div[class='diV' i] 2 === 2 .//div[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('diV', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

div[class*='iv' i] 10 === 10 .//div[contains(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('iv', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

ul>li[title$='One'] 5 === 5 .//ul/li[substring(@title, string-length(@title) - (string-length('One') - 1)) = 'One']

div[id]:has(h1, h2) 2 === 2 .//div[@id and count(.//h1 | .//h2) > 0]

p:nth-last-child(3) 5 === 5 .//p[count(following-sibling::*) = 2]

p:nth-of-type(even) 8 === 8 .//p[(count(preceding-sibling::p) + 1) mod 2 = 0]

ul>li[title^='Item'] 10 === 10 .//ul/li[starts-with(@title, 'Item')]

ul>li[title*='Item'] 10 === 10 .//ul/li[contains(@title, 'Item')]

main > div[id=lists] 1 === 1 .//main/div[@id='lists']

a:is([name], [href]) 2 === 2 .//a[@name or @href]

ul li:nth-child(odd) 22 === 22 .//ul//*[(count(preceding-sibling::*) + 1) mod 2 = 1]/self::li

ul li:nth-child(n+3) 27 === 27 .//ul//*[position() >= 3]/self::li

ul li:nth-child(n+4) 22 === 22 .//ul//*[position() >= 4]/self::li

ul li:nth-of-type(3) 5 === 5 .//ul//li[count(preceding-sibling::li) = 2]

div[class|='last' i] 2 === 2 .//div[(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('last', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('last', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

ul>li[title$='one' i] 5 === 5 .//ul/li[substring(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), string-length(@title) - (string-length('one') - 1)) = translate('one', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

ul>li[title~='two' i] 5 === 5 .//ul/li[contains(concat(' ', normalize-space(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')), ' '), concat(' ', translate('two', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), ' '))]

ul li:nth-child(even) 19 === 19 .//ul//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::li

ul li:nth-child(3n+2) 13 === 13 .//ul//*[position() >= 2 and (count(preceding-sibling::*) - 1) mod 3 = 0]/self::li

ul li:nth-child(-n+4) 24 === 24 .//ul//*[position() <= 4]/self::li

ul li:nth-child(5n-2) 7 === 7 .//ul//*[(count(preceding-sibling::*) + 3) mod 5 = 0]/self::li

p:nth-last-child(odd) 13 === 13 .//p[(count(following-sibling::*) + 1) mod 2 = 1]

p:nth-last-of-type(3) 3 === 3 .//p[count(following-sibling::p) = 2]

div [class^='emph' i] 2 === 2 .//div//*[starts-with(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('emph', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

div [class$='size' i] 2 === 2 .//div//*[substring(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), string-length(@class) - (string-length('size') - 1)) = translate('size', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

ul>li[title^='item' i] 10 === 10 .//ul/li[starts-with(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('item', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

ul li:nth-child(-3n+4) 12 === 12 .//ul//*[position() <= 4 and (count(preceding-sibling::*) - 3) mod 3 = 0]/self::li

p:nth-last-child(even) 9 === 9 .//p[(count(following-sibling::*) + 1) mod 2 = 0]

ul li:nth-of-type(odd) 22 === 22 .//ul//li[(count(preceding-sibling::li) + 1) mod 2 = 1]

ul li:nth-of-type(n+3) 27 === 27 .//ul//li[count(preceding-sibling::li) >= 2]

ul li:nth-of-type(n+4) 22 === 22 .//ul//li[count(preceding-sibling::li) >= 3]

div[class~='has-text'] 1 === 1 .//div[contains(concat(' ', normalize-space(@class), ' '), ' has-text ')]

article p:only-of-type 4 === 4 .//article//p[count(preceding-sibling::p) = 0 and count(following-sibling::p) = 0]

div[class~='parent' i] 1 === 1 .//div[contains(concat(' ', normalize-space(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')), ' '), concat(' ', translate('parent', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), ' '))]

ul li:nth-last-child(3) 5 === 5 .//ul//li[count(following-sibling::*) = 2]

ul li:nth-of-type(even) 19 === 19 .//ul//li[(count(preceding-sibling::li) + 1) mod 2 = 0]

ul li:nth-of-type(3n+2) 13 === 13 .//ul//li[count(preceding-sibling::li) >= 1 and (count(preceding-sibling::li) - 1) mod 3 = 0]

ul li:nth-of-type(3n-2) 17 === 17 .//ul//li[(count(preceding-sibling::li) + 3) mod 3 = 0]

ul li:nth-of-type(-n+4) 24 === 24 .//ul//li[count(preceding-sibling::li) <= 3]

p:nth-last-of-type(odd) 14 === 14 .//p[(count(following-sibling::p) + 1) mod 2 = 1]

article p:first-of-type 5 === 5 .//article//p[not(preceding-sibling::p)]

article em:last-of-type 3 === 3 .//article//em[not(following-sibling::em)]

:is(ol,ul) :is(ol,ul) ol 1 === 1 .//*[self::ol or self::ul]//*[self::ol or self::ul]//ol

ul li:nth-of-type(-3n+4) 12 === 12 .//ul//li[count(preceding-sibling::li) <= 3 and (count(preceding-sibling::li) - 3) mod 3 = 0]

p:nth-last-of-type(even) 8 === 8 .//p[(count(following-sibling::p) + 1) mod 2 = 0]

article div:only-of-type 2 === 2 .//article//div[count(preceding-sibling::div) = 0 and count(following-sibling::div) = 0]

ul>li[title='item one' i] 4 === 4 .//ul/li[translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('item one', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

ul li:nth-last-child(odd) 22 === 22 .//ul//li[(count(following-sibling::*) + 1) mod 2 = 1]

ul li:nth-last-child(n+3) 27 === 27 .//ul//li[count(following-sibling::*) >= 2]

ul li:nth-last-child(n+4) 22 === 22 .//ul//li[count(following-sibling::*) >= 3]

ul li:nth-last-of-type(3) 5 === 5 .//ul//li[count(following-sibling::li) = 2]

ul li:nth-last-child(even) 19 === 19 .//ul//li[(count(following-sibling::*) + 1) mod 2 = 0]

ul li:nth-last-child(3n+2) 13 === 13 .//ul//li[count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 3 = 0]

ul li:nth-last-child(-n+4) 24 === 24 .//ul//li[count(following-sibling::*) <= 3]

ul li:nth-last-child(5n-2) 7 === 7 .//ul//li[(count(following-sibling::*) + 3) mod 5 = 0]

ul li:nth-last-child(-3n+4) 12 === 12 .//ul//li[count(following-sibling::*) < 4 and (count(following-sibling::*) - 3) mod 3 = 0]

ul li:nth-last-of-type(n+3) 27 === 27 .//ul//li[count(following-sibling::li) >= 2]

ul li:nth-last-of-type(n+4) 22 === 22 .//ul//li[count(following-sibling::li) >= 3]

article>div>em:last-of-type 2 === 2 .//article/div/em[not(following-sibling::em)]

ul>li[title*='em Twenty On'] 1 === 1 .//ul/li[contains(@title, 'em Twenty On')]

ul li:nth-last-of-type(3n+2) 13 === 13 .//ul//li[count(following-sibling::li) >= 1 and (count(following-sibling::li) - 1) mod 3 = 0]

ul li:nth-last-of-type(3n-2) 17 === 17 .//ul//li[(count(following-sibling::li) + 3) mod 3 = 0]

ul li:nth-last-of-type(-n+4) 24 === 24 .//ul//li[count(following-sibling::li) <= 3]

ul li:nth-last-of-type(-3n+4) 12 === 12 .//ul//li[count(following-sibling::li) < 4 and (count(following-sibling::li) - 3) mod 3 = 0]

ul>li[title*='em twenty on' i] 1 === 1 .//ul/li[contains(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('em twenty on', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

article div[class]:last-of-type 5 === 5 .//article//div[@class and not(following-sibling::div)]

div:has(p, ul), div[id='header'] 8 === 8 .//div[count(.//p | .//ul) > 0] | .//div[@id='header']

div:not(:has(#lists)):not(:has(ul)) 19 === 19 .//div[not(self::node()[count(.//*[@id='lists']) > 0]) and not(count(.//ul) > 0)]

ul > li[ title = 'item one' i ] 4 === 4 .//ul/li[translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('item one', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

Have no matches: 9

p[class='xyzψω' i] - 0 - .//p[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('xyzψω', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

p[title^='ΑβγδΕ' i] - 0 - .//p[starts-with(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('ΑβγδΕ', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

p[title^='áβγδε' i] - 0 - .//p[starts-with(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('áβγδε', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

div[class$='-text'] - 0 - .//div[substring(@class, string-length(@class) - (string-length('-text') - 1)) = '-text']

p[title$='στυφχψΩ' i] - 0 - .//p[substring(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), string-length(@title) - (string-length('στυφχψΩ') - 1)) = translate('στυφχψΩ', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

div[class='content'] b - 0 - .//div[@class='content']//b

div[class='content' i] b - 0 - .//div[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('content', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]//b

div[class='CONTENT' i] b - 0 - .//div[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('CONTENT', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]//b

p[title='ΑβγδεζηθικλμνξοπρστυφχψΩ' i] - 0 - .//p[translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('ΑβγδεζηθικλμνξοπρστυφχψΩ', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

CssToXPath_test.html

Results:

Passed: 58

Have no matches: 49

Passed: 58

* 1781 === 1781 .//*

ul 22 === 22 .//ul

:root 1 === 1 //ancestor-or-self::*[last()]

div, p 375 === 375 .//div | .//p

p:has(b) 2 === 2 .//p[count(.//b) > 0]

div:last-child 1 === 1 .//div[not(following-sibling::*)]

p:not(.c1) 324 === 324 .//p[not(contains(concat(' ', normalize-space(@class), ' '), ' c1 '))]

p:nth-child(3) 8 === 8 .//*[position() = 3]/self::p

div:first-child 1 === 1 .//div[not(preceding-sibling::*)]

div>*:only-child 3 === 3 .//div/*[not(preceding-sibling::*) and not(following-sibling::*)]

p:nth-child(odd) 166 === 166 .//*[(count(preceding-sibling::*) + 1) mod 2 = 1]/self::p

p:nth-of-type(3) 24 === 24 .//p[count(preceding-sibling::p) = 2]

p:nth-child(even) 158 === 158 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

ul li:nth-child(3) 14 === 14 .//ul//*[position() = 3]/self::li

p:nth-of-type(odd) 176 === 176 .//p[(count(preceding-sibling::p) + 1) mod 2 = 1]

p:nth-last-child(3) 22 === 22 .//p[count(following-sibling::*) = 2]

p:nth-of-type(even) 148 === 148 .//p[(count(preceding-sibling::p) + 1) mod 2 = 0]

a:is([name], [href]) 296 === 296 .//a[@name or @href]

ul li:nth-child(odd) 52 === 52 .//ul//*[(count(preceding-sibling::*) + 1) mod 2 = 1]/self::li

ul li:nth-child(n+3) 53 === 53 .//ul//*[position() >= 3]/self::li

ul li:nth-child(n+4) 39 === 39 .//ul//*[position() >= 4]/self::li

ul li:nth-of-type(3) 14 === 14 .//ul//li[count(preceding-sibling::li) = 2]

ul li:nth-child(even) 42 === 42 .//ul//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::li

ul li:nth-child(3n+2) 31 === 31 .//ul//*[position() >= 2 and (count(preceding-sibling::*) - 1) mod 3 = 0]/self::li

ul li:nth-child(-n+4) 64 === 64 .//ul//*[position() <= 4]/self::li

ul li:nth-child(5n-2) 18 === 18 .//ul//*[(count(preceding-sibling::*) + 3) mod 5 = 0]/self::li

p:nth-last-child(odd) 151 === 151 .//p[(count(following-sibling::*) + 1) mod 2 = 1]

p:nth-last-of-type(3) 24 === 24 .//p[count(following-sibling::p) = 2]

ul li:nth-child(-3n+4) 31 === 31 .//ul//*[position() <= 4 and (count(preceding-sibling::*) - 3) mod 3 = 0]/self::li

p:nth-last-child(even) 173 === 173 .//p[(count(following-sibling::*) + 1) mod 2 = 0]

ul li:nth-of-type(odd) 52 === 52 .//ul//li[(count(preceding-sibling::li) + 1) mod 2 = 1]

ul li:nth-of-type(n+3) 53 === 53 .//ul//li[count(preceding-sibling::li) >= 2]

ul li:nth-of-type(n+4) 39 === 39 .//ul//li[count(preceding-sibling::li) >= 3]

ul li:nth-last-child(3) 14 === 14 .//ul//li[count(following-sibling::*) = 2]

ul li:nth-of-type(even) 42 === 42 .//ul//li[(count(preceding-sibling::li) + 1) mod 2 = 0]

ul li:nth-of-type(3n+2) 31 === 31 .//ul//li[count(preceding-sibling::li) >= 1 and (count(preceding-sibling::li) - 1) mod 3 = 0]

ul li:nth-of-type(3n-2) 38 === 38 .//ul//li[(count(preceding-sibling::li) + 3) mod 3 = 0]

ul li:nth-of-type(-n+4) 64 === 64 .//ul//li[count(preceding-sibling::li) <= 3]

p:nth-last-of-type(odd) 176 === 176 .//p[(count(following-sibling::p) + 1) mod 2 = 1]

ul li:nth-of-type(-3n+4) 31 === 31 .//ul//li[count(preceding-sibling::li) <= 3 and (count(preceding-sibling::li) - 3) mod 3 = 0]

p:nth-last-of-type(even) 148 === 148 .//p[(count(following-sibling::p) + 1) mod 2 = 0]

ul li:nth-last-child(odd) 52 === 52 .//ul//li[(count(following-sibling::*) + 1) mod 2 = 1]

ul li:nth-last-child(n+3) 53 === 53 .//ul//li[count(following-sibling::*) >= 2]

ul li:nth-last-child(n+4) 39 === 39 .//ul//li[count(following-sibling::*) >= 3]

ul li:nth-last-of-type(3) 14 === 14 .//ul//li[count(following-sibling::li) = 2]

ul li:nth-last-child(even) 42 === 42 .//ul//li[(count(following-sibling::*) + 1) mod 2 = 0]

ul li:nth-last-child(3n+2) 31 === 31 .//ul//li[count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 3 = 0]

ul li:nth-last-child(-n+4) 64 === 64 .//ul//li[count(following-sibling::*) <= 3]

ul li:nth-last-child(5n-2) 18 === 18 .//ul//li[(count(following-sibling::*) + 3) mod 5 = 0]

ul li:nth-last-child(-3n+4) 31 === 31 .//ul//li[count(following-sibling::*) < 4 and (count(following-sibling::*) - 3) mod 3 = 0]

ul li:nth-last-of-type(n+3) 53 === 53 .//ul//li[count(following-sibling::li) >= 2]

ul li:nth-last-of-type(n+4) 39 === 39 .//ul//li[count(following-sibling::li) >= 3]

ul li:nth-last-of-type(3n+2) 31 === 31 .//ul//li[count(following-sibling::li) >= 1 and (count(following-sibling::li) - 1) mod 3 = 0]

ul li:nth-last-of-type(3n-2) 38 === 38 .//ul//li[(count(following-sibling::li) + 3) mod 3 = 0]

ul li:nth-last-of-type(-n+4) 64 === 64 .//ul//li[count(following-sibling::li) <= 3]

ul li:nth-last-of-type(-3n+4) 31 === 31 .//ul//li[count(following-sibling::li) < 4 and (count(following-sibling::li) - 3) mod 3 = 0]

div:has(p, ul), div[id='header'] 51 === 51 .//div[count(.//p | .//ul) > 0] | .//div[@id='header']

div:not(:has(#lists)):not(:has(ul)) 49 === 49 .//div[not(self::node()[count(.//*[@id='lists']) > 0]) and not(count(.//ul) > 0)]

Have no matches: 49

div:empty - 0 - .//div[not(*) and not(text())]

div.content - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' content ')]

p[class=p2] - 0 - .//p[@class='p2']

p[class^=p2] - 0 - .//p[starts-with(@class, 'p2')]

p[class$=p2] - 0 - .//p[substring(@class, string-length(@class) - (string-length('p2') - 1)) = 'p2']

p[class~=p2] - 0 - .//p[contains(concat(' ', normalize-space(@class), ' '), ' p2 ')]

p[class*=p2] - 0 - .//p[contains(@class, 'p2')]

p[class|=p2] - 0 - .//p[(@class = 'p2' or starts-with(@class, 'p2-'))]

body[lang|=EN] - 0 - .//body[(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('EN', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('EN', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

ul:first-child>li:not(.c1,.c2,.c6,.c7) - 0 - .//ul[not(preceding-sibling::*)]/li[not(self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c1 ')] | self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c2 ')] | self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c6 ')] | self::node()[contains(concat(' ', normalize-space(@class), ' '), ' c7 ')])]

body[lang|=En i] - 0 - .//body[(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('En', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('En', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

div[class|='has'] - 0 - .//div[(@class = 'has' or starts-with(@class, 'has-'))]

div[class*='s-t'] - 0 - .//div[contains(@class, 's-t')]

p[class='xyzψω' i] - 0 - .//p[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('xyzψω', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

div[class^='has-'] - 0 - .//div[starts-with(@class, 'has-')]

div[class='diV' i] - 0 - .//div[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('diV', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

div[class*='iv' i] - 0 - .//div[contains(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('iv', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

ul>li[title$='One'] - 0 - .//ul/li[substring(@title, string-length(@title) - (string-length('One') - 1)) = 'One']

p[title^='ΑβγδΕ' i] - 0 - .//p[starts-with(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('ΑβγδΕ', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

p[title^='áβγδε' i] - 0 - .//p[starts-with(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('áβγδε', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

div[id]:has(h1, h2) - 0 - .//div[@id and count(.//h1 | .//h2) > 0]

div[class$='-text'] - 0 - .//div[substring(@class, string-length(@class) - (string-length('-text') - 1)) = '-text']

ul>li[title^='Item'] - 0 - .//ul/li[starts-with(@title, 'Item')]

ul>li[title*='Item'] - 0 - .//ul/li[contains(@title, 'Item')]

main > div[id=lists] - 0 - .//main/div[@id='lists']

div[class|='last' i] - 0 - .//div[(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('last', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('last', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

ul>li[title$='one' i] - 0 - .//ul/li[substring(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), string-length(@title) - (string-length('one') - 1)) = translate('one', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

ul>li[title~='two' i] - 0 - .//ul/li[contains(concat(' ', normalize-space(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')), ' '), concat(' ', translate('two', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), ' '))]

p[title$='στυφχψΩ' i] - 0 - .//p[substring(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), string-length(@title) - (string-length('στυφχψΩ') - 1)) = translate('στυφχψΩ', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

div [class^='emph' i] - 0 - .//div//*[starts-with(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('emph', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

div [class$='size' i] - 0 - .//div//*[substring(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), string-length(@class) - (string-length('size') - 1)) = translate('size', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

ul>li[title^='item' i] - 0 - .//ul/li[starts-with(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('item', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

div[class='content'] b - 0 - .//div[@class='content']//b

div[class~='has-text'] - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' has-text ')]

article p:only-of-type - 0 - .//article//p[count(preceding-sibling::p) = 0 and count(following-sibling::p) = 0]

div[class~='parent' i] - 0 - .//div[contains(concat(' ', normalize-space(translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')), ' '), concat(' ', translate('parent', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), ' '))]

article p:first-of-type - 0 - .//article//p[not(preceding-sibling::p)]

article em:last-of-type - 0 - .//article//em[not(following-sibling::em)]

:is(ol,ul) :is(ol,ul) ol - 0 - .//*[self::ol or self::ul]//*[self::ol or self::ul]//ol

div[class='content' i] b - 0 - .//div[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('content', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]//b

div[class='CONTENT' i] b - 0 - .//div[translate(@class, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('CONTENT', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]//b

article div:only-of-type - 0 - .//article//div[count(preceding-sibling::div) = 0 and count(following-sibling::div) = 0]

ul>li[title='item one' i] - 0 - .//ul/li[translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('item one', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

article>div>em:last-of-type - 0 - .//article/div/em[not(following-sibling::em)]

ul>li[title*='em Twenty On'] - 0 - .//ul/li[contains(@title, 'em Twenty On')]

ul>li[title*='em twenty on' i] - 0 - .//ul/li[contains(translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), translate('em twenty on', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'))]

article div[class]:last-of-type - 0 - .//article//div[@class and not(following-sibling::div)]

p[title='ΑβγδεζηθικλμνξοπρστυφχψΩ' i] - 0 - .//p[translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('ΑβγδεζηθικλμνξοπρστυφχψΩ', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

ul > li[ title = 'item one' i ] - 0 - .//ul/li[translate(@title, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('item one', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

CssW3CSelector.json

Results:

Passed: 91

Have no matches: 26

Coverter errors: 5

Passed: 91

.t1 24 === 24 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]

li,p 222 === 222 .//li | .//p

*.t1 24 === 24 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]

#foo 2 === 2 .//*[@id='foo']

li.t2 2 === 2 .//li[contains(concat(' ', normalize-space(@class), ' '), ' t2 ')]

li#t2 1 === 1 .//li[@id='t2']

*:root 1 === 1 //ancestor-or-self::*[last()]

address 43 === 43 .//address

p.t1.t2 4 === 4 .//p[contains(concat(' ', normalize-space(@class), ' '), ' t1 ') and contains(concat(' ', normalize-space(@class), ' '), ' t2 ')]

p:empty 3 === 3 .//p[not(*) and not(text())]

p[title] 24 === 24 .//p[@title]

div.t1 p 8 === 8 .//div[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//p

[hidden] 10 === 10 .//*[@hidden]

#pass#pass 1 === 1 .//*[@id='pass' and @id='pass']

div p.test 4 === 4 .//div//p[contains(concat(' ', normalize-space(@class), ' '), ' test ')]

div.test * 14 === 14 .//div[contains(concat(' ', normalize-space(@class), ' '), ' test ')]//*

div.stub * 120 === 120 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*

div.stub v 1 === 1 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//v

p[class~=b] 1 === 1 .//p[contains(concat(' ', normalize-space(@class), ' '), ' b ')]

p[lang|=en] 3 === 3 .//p[(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('en', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('en', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

table.t1 td 126 === 126 .//table[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//td

.t1:not(.t2) 20 === 20 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ') and not(contains(concat(' ', normalize-space(@class), ' '), ' t2 '))]

:not(.t2).t1 20 === 20 .//*[not(contains(concat(' ', normalize-space(@class), ' '), ' t2 ')) and contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]

.t2:not(.t1) 6 === 6 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t2 ') and not(contains(concat(' ', normalize-space(@class), ' '), ' t1 '))]

:not(.t1).t2 6 === 6 .//*[not(contains(concat(' ', normalize-space(@class), ' '), ' t1 ')) and contains(concat(' ', normalize-space(@class), ' '), ' t2 ')]

div:not(.t1) 94 === 94 .//div[not(contains(concat(' ', normalize-space(@class), ' '), ' t1 '))]

#test1:empty 1 === 1 .//*[@id='test1' and not(*) and not(text())]

#test2:empty 1 === 1 .//*[@id='test2' and not(*) and not(text())]

p:only-child 17 === 17 .//p[not(preceding-sibling::*) and not(following-sibling::*)]

div.stub p+p 24 === 24 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//p/following-sibling::*[1]/self::p

div.stub p~p 29 === 29 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//p/following-sibling::p

div.stub > * 114 === 114 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]/*

p[title^=foo] 4 === 4 .//p[starts-with(@title, 'foo')]

p[title$=bar] 2 === 2 .//p[substring(@title, string-length(@title) - (string-length('bar') - 1)) = 'bar']

p[title*=bar] 3 === 3 .//p[contains(@title, 'bar')]

address.t5.t5 1 === 1 .//address[contains(concat(' ', normalize-space(@class), ' '), ' t5 ') and contains(concat(' ', normalize-space(@class), ' '), ' t5 ')]

address:empty 3 === 3 .//address[not(*) and not(text())]

p *:last-child 14 === 14 .//p//*[not(following-sibling::*)]

p:not(:target) 164 === 164 .//p[not(starts-with(@href, '#'))]

p *:first-child 14 === 14 .//p//*[not(preceding-sibling::*)]

address[lang=fi] 1 === 1 .//address[translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('fi', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')]

#two:first-child 1 === 1 .//*[@id='two' and not(preceding-sibling::*)]

blockquote+div~p 28 === 28 .//blockquote/following-sibling::*[1]/self::div/following-sibling::p

blockquote~div+p 6 === 6 .//blockquote/following-sibling::div/following-sibling::*[1]/self::p

#test:not(:empty) 1 === 1 .//*[@id='test' and not(not(*) and not(text()))]

.t1 td:last-child 44 === 44 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//td[not(following-sibling::*)]

div.test *:not(a) 14 === 14 .//div[contains(concat(' ', normalize-space(@class), ' '), ' test ')]//*[not(self::a)]

div.stub *:not(p) 73 === 73 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(self::p)]

address[title=foo] 1 === 1 .//address[@title='foo']

.t1 td:first-child 44 === 44 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//td[not(preceding-sibling::*)]

p:not(:only-child) 147 === 147 .//p[not(not(preceding-sibling::*) and not(following-sibling::*))]

blockquote > div p 1 === 1 .//blockquote/div//p

blockquote + div p 1 === 1 .//blockquote/following-sibling::*[1]/self::div//p

blockquote div > p 1 === 1 .//blockquote//div/p

address[title~=foo] 2 === 2 .//address[contains(concat(' ', normalize-space(@title), ' '), ' foo ')]

p:not(.t1):not(.t2) 159 === 159 .//p[not(contains(concat(' ', normalize-space(@class), ' '), ' t1 ')) and not(contains(concat(' ', normalize-space(@class), ' '), ' t2 '))]

div.test *:not(div) 13 === 13 .//div[contains(concat(' ', normalize-space(@class), ' '), ' test ')]//*[not(self::div)]

div.stub *:not(div) 120 === 120 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(self::div)]

div.stub *:not(foo) 120 === 120 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(self::foo)]

address:last-of-type 17 === 17 .//address[not(following-sibling::address)]

div.stub *:not(.foo) 116 === 116 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(contains(concat(' ', normalize-space(@class), ' '), ' foo '))]

div.stub *:not(#foo) 119 === 119 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(@id='foo')]

line:nth-child(3n-1) 19 === 19 .//*[(count(preceding-sibling::*) + 2) mod 3 = 0]/self::line

ul li:nth-child(2n+1) 19 === 19 .//ul//*[(count(preceding-sibling::*)) mod 2 = 0]/self::li

ol li:nth-child(2n+0) 12 === 12 .//ol//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::li

address:first-of-type 17 === 17 .//address[not(preceding-sibling::address)]

line:nth-of-type(odd) 30 === 30 .//line[(count(preceding-sibling::line) + 1) mod 2 = 1]

p:not(:nth-of-type(3)) 151 === 151 .//p[not(count(preceding-sibling::p) = 2)]

p > *:not(:last-child) 1 === 1 .//p/*[not(not(following-sibling::*))]

table.t1 td,table.t2 td 222 === 222 .//table[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//td | .//table[contains(concat(' ', normalize-space(@class), ' '), ' t2 ')]//td

p > *:not(:first-child) 1 === 1 .//p/*[not(not(preceding-sibling::*))]

.t1 td:not(:last-child) 84 === 84 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//td[not(not(following-sibling::*))]

.t1 td:not(:first-child) 84 === 84 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//td[not(not(preceding-sibling::*))]

address:not(.t5):not(.t5) 42 === 42 .//address[not(contains(concat(' ', normalize-space(@class), ' '), ' t5 ')) and not(contains(concat(' ', normalize-space(@class), ' '), ' t5 '))]

address:not(:last-of-type) 26 === 26 .//address[not(not(following-sibling::address))]

div.test *:not(p):not(div) 5 === 5 .//div[contains(concat(' ', normalize-space(@class), ' '), ' test ')]//*[not(self::p) and not(self::div)]

table.t2 td:nth-child(3n+1) 36 === 36 .//table[contains(concat(' ', normalize-space(@class), ' '), ' t2 ')]//*[(count(preceding-sibling::*)) mod 3 = 0]/self::td

address:not(:first-of-type) 26 === 26 .//address[not(not(preceding-sibling::address))]

p:not(:nth-last-of-type(3)) 151 === 151 .//p[not(count(following-sibling::p) = 2)]

line:nth-last-of-type(3n-1) 19 === 19 .//line[(count(following-sibling::line) + 2) mod 3 = 0]

table.t1 tr:nth-child(-1n+4) 34 === 34 .//table[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//*[position() <= 4]/self::tr

ul > li:not(:nth-child(odd)) 15 === 15 .//ul/li[not((count(preceding-sibling::*) + 1) mod 2 = 1)]

ol > li:not(:nth-child(even)) 12 === 12 .//ol/li[not((count(preceding-sibling::*) + 1) mod 2 = 0)]

div.stub *:not([title*=' on']) 105 === 105 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(contains(@title, ' on'))]

div.stub *:not([title$='tait']) 103 === 103 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(substring(@title, string-length(@title) - (string-length('tait') - 1)) = 'tait')]

.t1 *:not(address:only-of-type) 194 === 194 .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//*[not(self::address[count(preceding-sibling::address) = 0 and count(following-sibling::address) = 0])]

div.stub *:not([title^='si on']) 106 === 106 .//div[contains(concat(' ', normalize-space(@class), ' '), ' stub ')]//*[not(starts-with(@title, 'si on'))]

table.t2 td:not(:nth-child(3n+1)) 60 === 60 .//table[contains(concat(' ', normalize-space(@class), ' '), ' t2 ')]//td[not((count(preceding-sibling::*)) mod 3 = 0)]

table.t1 tr:not(:nth-child(-1n+4)) 8 === 8 .//table[contains(concat(' ', normalize-space(@class), ' '), ' t1 ')]//tr[not(count(preceding-sibling::*) <= 3)]

p:not(#other).class:not(.fail).test#id#id 1 === 1 .//p[not(@id='other') and contains(concat(' ', normalize-space(@class), ' '), ' class ') and not(contains(concat(' ', normalize-space(@class), ' '), ' fail ')) and contains(concat(' ', normalize-space(@class), ' '), ' test ') and @id='id' and @id='id']

main p:only-of-type, main i[name]:only-of-type 1 === 1 .//main//p[count(preceding-sibling::p) = 0 and count(following-sibling::p) = 0] | .//main//i[@name and count(preceding-sibling::i) = 0 and count(following-sibling::i) = 0]

Have no matches: 26

.t1.fail - 0 - .//*[contains(concat(' ', normalize-space(@class), ' '), ' t1 ') and contains(concat(' ', normalize-space(@class), ' '), ' fail ')]

p:target - 0 - .//p[starts-with(@href, '#')]

div.te.st - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' te ') and contains(concat(' ', normalize-space(@class), ' '), ' st ')]

.fail div - 0 - .//*[contains(concat(' ', normalize-space(@class), ' '), ' fail ')]//div

#fail div - 0 - .//*[@id='fail']//div

.fail+div - 0 - .//*[contains(concat(' ', normalize-space(@class), ' '), ' fail ')]/following-sibling::*[1]/self::div

#test#fail - 0 - .//*[@id='test' and @id='fail']

#fail#test - 0 - .//*[@id='fail' and @id='test']

[type~=odd] - 0 - .//*[contains(concat(' ', normalize-space(@type), ' '), ' odd ')]

span[title=a] - 0 - .//span[@title='a']

[type~=match] - 0 - .//*[contains(concat(' ', normalize-space(@type), ' '), ' match ')]

span[class~=b] - 0 - .//span[contains(concat(' ', normalize-space(@class), ' '), ' b ')]

span[lang|=fr] - 0 - .//span[(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') = translate('fr', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz') or starts-with(translate(@lang, 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), concat(translate('fr', 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '-')))]

#three:last-child - 0 - .//*[@id='three' and not(following-sibling::*)]

div.testText div p - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' testText ')]//div//p

#stub~div div+div div - 0 - .//*[@id='stub']/following-sibling::div//div/following-sibling::*[1]/self::div//div

div.testText > div > p - 0 - .//div[contains(concat(' ', normalize-space(@class), ' '), ' testText ')]/div/p

#Aone#Atwo,#Aone#Athree,#Atwo#Athree - 0 - .//*[@id='Aone' and @id='Atwo'] | .//*[@id='Aone' and @id='Athree'] | .//*[@id='Atwo' and @id='Athree']

#Bone#Btwo,#Bone#Bthree,#Btwo#Bthree - 0 - .//*[@id='Bone' and @id='Btwo'] | .//*[@id='Bone' and @id='Bthree'] | .//*[@id='Btwo' and @id='Bthree']

#Cone#Ctwo,#Cone#Cthree,#Ctwo#Cthree - 0 - .//*[@id='Cone' and @id='Ctwo'] | .//*[@id='Cone' and @id='Cthree'] | .//*[@id='Ctwo' and @id='Cthree']

#Done#Dtwo,#Done#Dthree,#Dtwo#Dthree - 0 - .//*[@id='Done' and @id='Dtwo'] | .//*[@id='Done' and @id='Dthree'] | .//*[@id='Dtwo' and @id='Dthree']

div:not(#theid).class:not(.fail).test#theid#theid - 0 - .//div[not(@id='theid') and contains(concat(' ', normalize-space(@class), ' '), ' class ') and not(contains(concat(' ', normalize-space(@class), ' '), ' fail ')) and contains(concat(' ', normalize-space(@class), ' '), ' test ') and @id='theid' and @id='theid']

div:not(#other).class:not(.test).test#theid#theid - 0 - .//div[not(@id='other') and contains(concat(' ', normalize-space(@class), ' '), ' class ') and not(contains(concat(' ', normalize-space(@class), ' '), ' test ')) and contains(concat(' ', normalize-space(@class), ' '), ' test ') and @id='theid' and @id='theid']

div:not(#other).notclass:not(.fail).test#theid#theid - 0 - .//div[not(@id='other') and contains(concat(' ', normalize-space(@class), ' '), ' notclass ') and not(contains(concat(' ', normalize-space(@class), ' '), ' fail ')) and contains(concat(' ', normalize-space(@class), ' '), ' test ') and @id='theid' and @id='theid']

div:not(#other).class:not(.fail).nottest#theid#theid - 0 - .//div[not(@id='other') and contains(concat(' ', normalize-space(@class), ' '), ' class ') and not(contains(concat(' ', normalize-space(@class), ' '), ' fail ')) and contains(concat(' ', normalize-space(@class), ' '), ' nottest ') and @id='theid' and @id='theid']

div:not(#other).class:not(.fail).nottest#theid#other - 0 - .//div[not(@id='other') and contains(concat(' ', normalize-space(@class), ' '), ' class ') and not(contains(concat(' ', normalize-space(@class), ' '), ' fail ')) and contains(concat(' ', normalize-space(@class), ' '), ' nottest ') and @id='theid' and @id='other']

Coverter errors: 5

p, converter error: State.Text. Unexpected character ','

p[class^=''] converter error: function getAttributeValue() - RegExp '/(?:"([^"]+)"|'([^']+)'|([^ "'\]]+))(?: +([siSI]))?(?=\])/y' failed to match the string ''']'

foo & address, p converter error: State.Text, check=true. Unexpected character '&'

dl > *:not(:nth-of-type(3n+1)) converter error: Pseudo-class ':nth-of-type' is required an element name; '*' is not implemented.

dl > *:not(:nth-last-of-type(3n+1)) converter error: Pseudo-class ':nth-last-of-type' is required an element name; '*' is not implemented.

not-nth-child.json

Results:

Passed: 107

Passed: 107

p:not(:nth-child(1)) 43 === 43 .//p[not(count(preceding-sibling::*) = 0)]

p:not(:nth-child(2)) 45 === 45 .//p[not(count(preceding-sibling::*) = 1)]

p:not(:nth-child(3)) 43 === 43 .//p[not(count(preceding-sibling::*) = 2)]

p:not(:nth-child(4)) 43 === 43 .//p[not(count(preceding-sibling::*) = 3)]

p:not(:nth-child(5)) 45 === 45 .//p[not(count(preceding-sibling::*) = 4)]

p:not(:nth-child(2n)) 25 === 25 .//p[not((count(preceding-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-child(3n)) 34 === 34 .//p[not((count(preceding-sibling::*) + 1) mod 3 = 0)]

p:not(:nth-child(4n)) 36 === 36 .//p[not((count(preceding-sibling::*) + 1) mod 4 = 0)]

p:not(:nth-child(5n)) 42 === 42 .//p[not((count(preceding-sibling::*) + 1) mod 5 = 0)]

p:not(:nth-child(odd)) 23 === 23 .//p[not((count(preceding-sibling::*) + 1) mod 2 = 1)]

p:not(:nth-child(n+2)) 5 === 5 .//p[not(count(preceding-sibling::*) >= 1)]

p:not(:nth-child(n+3)) 8 === 8 .//p[not(count(preceding-sibling::*) >= 2)]

p:not(:nth-child(n+4)) 13 === 13 .//p[not(count(preceding-sibling::*) >= 3)]

p:not(:nth-child(n+5)) 18 === 18 .//p[not(count(preceding-sibling::*) >= 4)]

p:not(:nth-child(even)) 25 === 25 .//p[not((count(preceding-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-child(0n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) = 0)]

p:not(:nth-child(0n+2)) 45 === 45 .//p[not(count(preceding-sibling::*) = 1)]

p:not(:nth-child(0n+3)) 43 === 43 .//p[not(count(preceding-sibling::*) = 2)]

p:not(:nth-child(0n+4)) 43 === 43 .//p[not(count(preceding-sibling::*) = 3)]

p:not(:nth-child(0n+5)) 45 === 45 .//p[not(count(preceding-sibling::*) = 4)]

p:not(:nth-child(1n+2)) 5 === 5 .//p[not(count(preceding-sibling::*) >= 1)]

p:not(:nth-child(1n+3)) 8 === 8 .//p[not(count(preceding-sibling::*) >= 2)]

p:not(:nth-child(1n+4)) 13 === 13 .//p[not(count(preceding-sibling::*) >= 3)]

p:not(:nth-child(1n+5)) 18 === 18 .//p[not(count(preceding-sibling::*) >= 4)]

p:not(:nth-child(2n+0)) 25 === 25 .//p[not((count(preceding-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-child(2n-0)) 25 === 25 .//p[not((count(preceding-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-child(2n+1)) 23 === 23 .//p[not((count(preceding-sibling::*)) mod 2 = 0)]

p:not(:nth-child(2n-1)) 23 === 23 .//p[not((count(preceding-sibling::*) + 2) mod 2 = 0)]

p:not(:nth-child(2n+2)) 25 === 25 .//p[not(count(preceding-sibling::*) >= 1 and (count(preceding-sibling::*) - 1) mod 2 = 0)]

p:not(:nth-child(2n-2)) 25 === 25 .//p[not((count(preceding-sibling::*) + 3) mod 2 = 0)]

p:not(:nth-child(2n+3)) 28 === 28 .//p[not(count(preceding-sibling::*) >= 2 and (count(preceding-sibling::*) - 2) mod 2 = 0)]

p:not(:nth-child(2n-3)) 23 === 23 .//p[not((count(preceding-sibling::*) + 4) mod 2 = 0)]

p:not(:nth-child(2n+4)) 28 === 28 .//p[not(count(preceding-sibling::*) >= 3 and (count(preceding-sibling::*) - 3) mod 2 = 0)]

p:not(:nth-child(2n-4)) 25 === 25 .//p[not((count(preceding-sibling::*) + 5) mod 2 = 0)]

p:not(:nth-child(2n+5)) 33 === 33 .//p[not(count(preceding-sibling::*) >= 4 and (count(preceding-sibling::*) - 4) mod 2 = 0)]

p:not(:nth-child(2n-5)) 23 === 23 .//p[not((count(preceding-sibling::*) + 6) mod 2 = 0)]

p:not(:nth-child(3n+0)) 34 === 34 .//p[not((count(preceding-sibling::*) + 1) mod 3 = 0)]

p:not(:nth-child(3n-0)) 34 === 34 .//p[not((count(preceding-sibling::*) + 1) mod 3 = 0)]

p:not(:nth-child(3n+1)) 29 === 29 .//p[not((count(preceding-sibling::*)) mod 3 = 0)]

p:not(:nth-child(3n-1)) 33 === 33 .//p[not((count(preceding-sibling::*) + 2) mod 3 = 0)]

p:not(:nth-child(3n+2)) 33 === 33 .//p[not(count(preceding-sibling::*) >= 1 and (count(preceding-sibling::*) - 1) mod 3 = 0)]

p:not(:nth-child(3n-2)) 29 === 29 .//p[not((count(preceding-sibling::*) + 3) mod 3 = 0)]

p:not(:nth-child(3n+3)) 34 === 34 .//p[not(count(preceding-sibling::*) >= 2 and (count(preceding-sibling::*) - 2) mod 3 = 0)]

p:not(:nth-child(3n-3)) 34 === 34 .//p[not((count(preceding-sibling::*) + 4) mod 3 = 0)]

p:not(:nth-child(3n+4)) 34 === 34 .//p[not(count(preceding-sibling::*) >= 3 and (count(preceding-sibling::*) - 3) mod 3 = 0)]

p:not(:nth-child(3n-4)) 33 === 33 .//p[not((count(preceding-sibling::*) + 5) mod 3 = 0)]

p:not(:nth-child(3n+5)) 36 === 36 .//p[not(count(preceding-sibling::*) >= 4 and (count(preceding-sibling::*) - 4) mod 3 = 0)]

p:not(:nth-child(3n-5)) 29 === 29 .//p[not((count(preceding-sibling::*) + 6) mod 3 = 0)]

p:not(:nth-child(4n+0)) 36 === 36 .//p[not((count(preceding-sibling::*) + 1) mod 4 = 0)]

p:not(:nth-child(4n-0)) 36 === 36 .//p[not((count(preceding-sibling::*) + 1) mod 4 = 0)]

p:not(:nth-child(4n+1)) 35 === 35 .//p[not((count(preceding-sibling::*)) mod 4 = 0)]

p:not(:nth-child(4n-1)) 36 === 36 .//p[not((count(preceding-sibling::*) + 2) mod 4 = 0)]

p:not(:nth-child(4n+2)) 37 === 37 .//p[not(count(preceding-sibling::*) >= 1 and (count(preceding-sibling::*) - 1) mod 4 = 0)]

p:not(:nth-child(4n-2)) 37 === 37 .//p[not((count(preceding-sibling::*) + 3) mod 4 = 0)]

p:not(:nth-child(4n+3)) 36 === 36 .//p[not(count(preceding-sibling::*) >= 2 and (count(preceding-sibling::*) - 2) mod 4 = 0)]

p:not(:nth-child(4n-3)) 35 === 35 .//p[not((count(preceding-sibling::*) + 4) mod 4 = 0)]

p:not(:nth-child(4n+4)) 36 === 36 .//p[not(count(preceding-sibling::*) >= 3 and (count(preceding-sibling::*) - 3) mod 4 = 0)]

p:not(:nth-child(4n-4)) 36 === 36 .//p[not((count(preceding-sibling::*) + 5) mod 4 = 0)]

p:not(:nth-child(4n+5)) 40 === 40 .//p[not(count(preceding-sibling::*) >= 4 and (count(preceding-sibling::*) - 4) mod 4 = 0)]

p:not(:nth-child(4n-5)) 36 === 36 .//p[not((count(preceding-sibling::*) + 6) mod 4 = 0)]

p:not(:nth-child(5n+0)) 42 === 42 .//p[not((count(preceding-sibling::*) + 1) mod 5 = 0)]

p:not(:nth-child(5n-0)) 42 === 42 .//p[not((count(preceding-sibling::*) + 1) mod 5 = 0)]

p:not(:nth-child(5n+1)) 36 === 36 .//p[not((count(preceding-sibling::*)) mod 5 = 0)]

p:not(:nth-child(5n-1)) 39 === 39 .//p[not((count(preceding-sibling::*) + 2) mod 5 = 0)]

p:not(:nth-child(5n+2)) 38 === 38 .//p[not(count(preceding-sibling::*) >= 1 and (count(preceding-sibling::*) - 1) mod 5 = 0)]

p:not(:nth-child(5n-2)) 37 === 37 .//p[not((count(preceding-sibling::*) + 3) mod 5 = 0)]

p:not(:nth-child(5n+3)) 37 === 37 .//p[not(count(preceding-sibling::*) >= 2 and (count(preceding-sibling::*) - 2) mod 5 = 0)]

p:not(:nth-child(5n-3)) 38 === 38 .//p[not((count(preceding-sibling::*) + 4) mod 5 = 0)]

p:not(:nth-child(5n+4)) 39 === 39 .//p[not(count(preceding-sibling::*) >= 3 and (count(preceding-sibling::*) - 3) mod 5 = 0)]

p:not(:nth-child(5n-4)) 36 === 36 .//p[not((count(preceding-sibling::*) + 5) mod 5 = 0)]

p:not(:nth-child(5n+5)) 42 === 42 .//p[not(count(preceding-sibling::*) >= 4 and (count(preceding-sibling::*) - 4) mod 5 = 0)]

p:not(:nth-child(5n-5)) 42 === 42 .//p[not((count(preceding-sibling::*) + 6) mod 5 = 0)]

p:not(:nth-child(-n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 0)]

p:not(:nth-child(-n+2)) 40 === 40 .//p[not(count(preceding-sibling::*) <= 1)]

p:not(:nth-child(-n+3)) 35 === 35 .//p[not(count(preceding-sibling::*) <= 2)]

p:not(:nth-child(-n+4)) 30 === 30 .//p[not(count(preceding-sibling::*) <= 3)]

p:not(:nth-child(-n+5)) 27 === 27 .//p[not(count(preceding-sibling::*) <= 4)]

p:not(:nth-child(-0n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) = 0)]

p:not(:nth-child(-0n+2)) 45 === 45 .//p[not(count(preceding-sibling::*) = 1)]

p:not(:nth-child(-0n+3)) 43 === 43 .//p[not(count(preceding-sibling::*) = 2)]

p:not(:nth-child(-0n+4)) 43 === 43 .//p[not(count(preceding-sibling::*) = 3)]

p:not(:nth-child(-0n+5)) 45 === 45 .//p[not(count(preceding-sibling::*) = 4)]

p:not(:nth-child(-1n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 0)]

p:not(:nth-child(-1n+2)) 40 === 40 .//p[not(count(preceding-sibling::*) <= 1)]

p:not(:nth-child(-1n+3)) 35 === 35 .//p[not(count(preceding-sibling::*) <= 2)]

p:not(:nth-child(-1n+4)) 30 === 30 .//p[not(count(preceding-sibling::*) <= 3)]

p:not(:nth-child(-1n+5)) 27 === 27 .//p[not(count(preceding-sibling::*) <= 4)]

p:not(:nth-child(-2n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 0 and (count(preceding-sibling::*)) mod 2 = 0)]

p:not(:nth-child(-2n+2)) 45 === 45 .//p[not(count(preceding-sibling::*) <= 1 and (count(preceding-sibling::*) - 1) mod 2 = 0)]

p:not(:nth-child(-2n+3)) 38 === 38 .//p[not(count(preceding-sibling::*) <= 2 and (count(preceding-sibling::*) - 2) mod 2 = 0)]

p:not(:nth-child(-2n+4)) 40 === 40 .//p[not(count(preceding-sibling::*) <= 3 and (count(preceding-sibling::*) - 3) mod 2 = 0)]

p:not(:nth-child(-2n+5)) 35 === 35 .//p[not(count(preceding-sibling::*) <= 4 and (count(preceding-sibling::*) - 4) mod 2 = 0)]

p:not(:nth-child(-3n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 0 and (count(preceding-sibling::*)) mod 3 = 0)]

p:not(:nth-child(-3n+2)) 45 === 45 .//p[not(count(preceding-sibling::*) <= 1 and (count(preceding-sibling::*) - 1) mod 3 = 0)]

p:not(:nth-child(-3n+3)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 2 and (count(preceding-sibling::*) - 2) mod 3 = 0)]

p:not(:nth-child(-3n+4)) 38 === 38 .//p[not(count(preceding-sibling::*) <= 3 and (count(preceding-sibling::*) - 3) mod 3 = 0)]

p:not(:nth-child(-3n+5)) 42 === 42 .//p[not(count(preceding-sibling::*) <= 4 and (count(preceding-sibling::*) - 4) mod 3 = 0)]

p:not(:nth-child(-4n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 0 and (count(preceding-sibling::*)) mod 4 = 0)]

p:not(:nth-child(-4n+2)) 45 === 45 .//p[not(count(preceding-sibling::*) <= 1 and (count(preceding-sibling::*) - 1) mod 4 = 0)]

p:not(:nth-child(-4n+3)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 2 and (count(preceding-sibling::*) - 2) mod 4 = 0)]

p:not(:nth-child(-4n+4)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 3 and (count(preceding-sibling::*) - 3) mod 4 = 0)]

p:not(:nth-child(-4n+5)) 40 === 40 .//p[not(count(preceding-sibling::*) <= 4 and (count(preceding-sibling::*) - 4) mod 4 = 0)]

p:not(:nth-child(-5n+1)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 0 and (count(preceding-sibling::*)) mod 5 = 0)]

p:not(:nth-child(-5n+2)) 45 === 45 .//p[not(count(preceding-sibling::*) <= 1 and (count(preceding-sibling::*) - 1) mod 5 = 0)]

p:not(:nth-child(-5n+3)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 2 and (count(preceding-sibling::*) - 2) mod 5 = 0)]

p:not(:nth-child(-5n+4)) 43 === 43 .//p[not(count(preceding-sibling::*) <= 3 and (count(preceding-sibling::*) - 3) mod 5 = 0)]

p:not(:nth-child(-5n+5)) 45 === 45 .//p[not(count(preceding-sibling::*) <= 4 and (count(preceding-sibling::*) - 4) mod 5 = 0)]

not-nth-last-child.json

Results:

Passed: 107

Passed: 107

p:not(:nth-last-child(1)) 45 === 45 .//p[not(count(following-sibling::*) = 0)]

p:not(:nth-last-child(2)) 45 === 45 .//p[not(count(following-sibling::*) = 1)]

p:not(:nth-last-child(3)) 44 === 44 .//p[not(count(following-sibling::*) = 2)]

p:not(:nth-last-child(4)) 44 === 44 .//p[not(count(following-sibling::*) = 3)]

p:not(:nth-last-child(5)) 44 === 44 .//p[not(count(following-sibling::*) = 4)]

p:not(:nth-last-child(2n)) 25 === 25 .//p[not((count(following-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-last-child(3n)) 32 === 32 .//p[not((count(following-sibling::*) + 1) mod 3 = 0)]

p:not(:nth-last-child(4n)) 37 === 37 .//p[not((count(following-sibling::*) + 1) mod 4 = 0)]

p:not(:nth-last-child(5n)) 40 === 40 .//p[not((count(following-sibling::*) + 1) mod 5 = 0)]

p:not(:nth-last-child(odd)) 23 === 23 .//p[not((count(following-sibling::*) + 1) mod 2 = 1)]

p:not(:nth-last-child(n+2)) 3 === 3 .//p[not(count(following-sibling::*) >= 1)]

p:not(:nth-last-child(n+3)) 6 === 6 .//p[not(count(following-sibling::*) >= 2)]

p:not(:nth-last-child(n+4)) 10 === 10 .//p[not(count(following-sibling::*) >= 3)]

p:not(:nth-last-child(n+5)) 14 === 14 .//p[not(count(following-sibling::*) >= 4)]

p:not(:nth-last-child(even)) 25 === 25 .//p[not((count(following-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-last-child(0n+1)) 45 === 45 .//p[not(count(following-sibling::*) = 0)]

p:not(:nth-last-child(0n+2)) 45 === 45 .//p[not(count(following-sibling::*) = 1)]

p:not(:nth-last-child(0n+3)) 44 === 44 .//p[not(count(following-sibling::*) = 2)]

p:not(:nth-last-child(0n+4)) 44 === 44 .//p[not(count(following-sibling::*) = 3)]

p:not(:nth-last-child(0n+5)) 44 === 44 .//p[not(count(following-sibling::*) = 4)]

p:not(:nth-last-child(1n+2)) 3 === 3 .//p[not(count(following-sibling::*) >= 1)]

p:not(:nth-last-child(1n+3)) 6 === 6 .//p[not(count(following-sibling::*) >= 2)]

p:not(:nth-last-child(1n+4)) 10 === 10 .//p[not(count(following-sibling::*) >= 3)]

p:not(:nth-last-child(1n+5)) 14 === 14 .//p[not(count(following-sibling::*) >= 4)]

p:not(:nth-last-child(2n+0)) 25 === 25 .//p[not((count(following-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-last-child(2n-0)) 25 === 25 .//p[not((count(following-sibling::*) + 1) mod 2 = 0)]

p:not(:nth-last-child(2n+1)) 23 === 23 .//p[not((count(following-sibling::*)) mod 2 = 0)]

p:not(:nth-last-child(2n-1)) 23 === 23 .//p[not((count(following-sibling::*) + 2) mod 2 = 0)]

p:not(:nth-last-child(2n+2)) 25 === 25 .//p[not(count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 2 = 0)]

p:not(:nth-last-child(2n-2)) 25 === 25 .//p[not((count(following-sibling::*) + 3) mod 2 = 0)]

p:not(:nth-last-child(2n+3)) 26 === 26 .//p[not(count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 2 = 0)]

p:not(:nth-last-child(2n-3)) 23 === 23 .//p[not((count(following-sibling::*) + 4) mod 2 = 0)]

p:not(:nth-last-child(2n+4)) 28 === 28 .//p[not(count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 2 = 0)]

p:not(:nth-last-child(2n-4)) 25 === 25 .//p[not((count(following-sibling::*) + 5) mod 2 = 0)]

p:not(:nth-last-child(2n+5)) 30 === 30 .//p[not(count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 2 = 0)]

p:not(:nth-last-child(2n-5)) 23 === 23 .//p[not((count(following-sibling::*) + 6) mod 2 = 0)]

p:not(:nth-last-child(3n+0)) 32 === 32 .//p[not((count(following-sibling::*) + 1) mod 3 = 0)]

p:not(:nth-last-child(3n-0)) 32 === 32 .//p[not((count(following-sibling::*) + 1) mod 3 = 0)]

p:not(:nth-last-child(3n+1)) 31 === 31 .//p[not((count(following-sibling::*)) mod 3 = 0)]

p:not(:nth-last-child(3n-1)) 33 === 33 .//p[not((count(following-sibling::*) + 2) mod 3 = 0)]

p:not(:nth-last-child(3n+2)) 33 === 33 .//p[not(count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 3 = 0)]

p:not(:nth-last-child(3n-2)) 31 === 31 .//p[not((count(following-sibling::*) + 3) mod 3 = 0)]

p:not(:nth-last-child(3n+3)) 32 === 32 .//p[not(count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 3 = 0)]

p:not(:nth-last-child(3n-3)) 32 === 32 .//p[not((count(following-sibling::*) + 4) mod 3 = 0)]

p:not(:nth-last-child(3n+4)) 34 === 34 .//p[not(count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 3 = 0)]

p:not(:nth-last-child(3n-4)) 33 === 33 .//p[not((count(following-sibling::*) + 5) mod 3 = 0)]

p:not(:nth-last-child(3n+5)) 36 === 36 .//p[not(count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 3 = 0)]

p:not(:nth-last-child(3n-5)) 31 === 31 .//p[not((count(following-sibling::*) + 6) mod 3 = 0)]

p:not(:nth-last-child(4n+0)) 37 === 37 .//p[not((count(following-sibling::*) + 1) mod 4 = 0)]

p:not(:nth-last-child(4n-0)) 37 === 37 .//p[not((count(following-sibling::*) + 1) mod 4 = 0)]

p:not(:nth-last-child(4n+1)) 35 === 35 .//p[not((count(following-sibling::*)) mod 4 = 0)]

p:not(:nth-last-child(4n-1)) 36 === 36 .//p[not((count(following-sibling::*) + 2) mod 4 = 0)]

p:not(:nth-last-child(4n+2)) 36 === 36 .//p[not(count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 4 = 0)]

p:not(:nth-last-child(4n-2)) 36 === 36 .//p[not((count(following-sibling::*) + 3) mod 4 = 0)]

p:not(:nth-last-child(4n+3)) 36 === 36 .//p[not(count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 4 = 0)]

p:not(:nth-last-child(4n-3)) 35 === 35 .//p[not((count(following-sibling::*) + 4) mod 4 = 0)]

p:not(:nth-last-child(4n+4)) 37 === 37 .//p[not(count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 4 = 0)]

p:not(:nth-last-child(4n-4)) 37 === 37 .//p[not((count(following-sibling::*) + 5) mod 4 = 0)]

p:not(:nth-last-child(4n+5)) 38 === 38 .//p[not(count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 4 = 0)]

p:not(:nth-last-child(4n-5)) 36 === 36 .//p[not((count(following-sibling::*) + 6) mod 4 = 0)]

p:not(:nth-last-child(5n+0)) 40 === 40 .//p[not((count(following-sibling::*) + 1) mod 5 = 0)]

p:not(:nth-last-child(5n-0)) 40 === 40 .//p[not((count(following-sibling::*) + 1) mod 5 = 0)]

p:not(:nth-last-child(5n+1)) 39 === 39 .//p[not((count(following-sibling::*)) mod 5 = 0)]

p:not(:nth-last-child(5n-1)) 38 === 38 .//p[not((count(following-sibling::*) + 2) mod 5 = 0)]

p:not(:nth-last-child(5n+2)) 38 === 38 .//p[not(count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 5 = 0)]

p:not(:nth-last-child(5n-2)) 37 === 37 .//p[not((count(following-sibling::*) + 3) mod 5 = 0)]

p:not(:nth-last-child(5n+3)) 37 === 37 .//p[not(count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 5 = 0)]

p:not(:nth-last-child(5n-3)) 38 === 38 .//p[not((count(following-sibling::*) + 4) mod 5 = 0)]

p:not(:nth-last-child(5n+4)) 38 === 38 .//p[not(count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 5 = 0)]

p:not(:nth-last-child(5n-4)) 39 === 39 .//p[not((count(following-sibling::*) + 5) mod 5 = 0)]

p:not(:nth-last-child(5n+5)) 40 === 40 .//p[not(count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 5 = 0)]

p:not(:nth-last-child(5n-5)) 40 === 40 .//p[not((count(following-sibling::*) + 6) mod 5 = 0)]

p:not(:nth-last-child(-n+1)) 45 === 45 .//p[not(count(following-sibling::*) <= 0)]

p:not(:nth-last-child(-n+2)) 42 === 42 .//p[not(count(following-sibling::*) <= 1)]

p:not(:nth-last-child(-n+3)) 38 === 38 .//p[not(count(following-sibling::*) <= 2)]

p:not(:nth-last-child(-n+4)) 34 === 34 .//p[not(count(following-sibling::*) <= 3)]

p:not(:nth-last-child(-n+5)) 30 === 30 .//p[not(count(following-sibling::*) <= 4)]

p:not(:nth-last-child(-0n+1)) 45 === 45 .//p[not(count(following-sibling::*) < 1)]

p:not(:nth-last-child(-0n+2)) 45 === 45 .//p[not(count(following-sibling::*) = 1)]

p:not(:nth-last-child(-0n+3)) 44 === 44 .//p[not(count(following-sibling::*) = 2)]

p:not(:nth-last-child(-0n+4)) 44 === 44 .//p[not(count(following-sibling::*) = 3)]

p:not(:nth-last-child(-0n+5)) 44 === 44 .//p[not(count(following-sibling::*) = 4)]

p:not(:nth-last-child(-1n+1)) 45 === 45 .//p[not(count(following-sibling::*) <= 0)]

p:not(:nth-last-child(-1n+2)) 42 === 42 .//p[not(count(following-sibling::*) < 2)]

p:not(:nth-last-child(-1n+3)) 38 === 38 .//p[not(count(following-sibling::*) < 3)]

p:not(:nth-last-child(-1n+4)) 34 === 34 .//p[not(count(following-sibling::*) < 4)]

p:not(:nth-last-child(-1n+5)) 30 === 30 .//p[not(count(following-sibling::*) < 5)]

p:not(:nth-last-child(-2n+1)) 45 === 45 .//p[not(count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 2 = 0)]

p:not(:nth-last-child(-2n+2)) 45 === 45 .//p[not(count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 2 = 0)]

p:not(:nth-last-child(-2n+3)) 41 === 41 .//p[not(count(following-sibling::*) < 3 and (count(following-sibling::*) - 2) mod 2 = 0)]

p:not(:nth-last-child(-2n+4)) 41 === 41 .//p[not(count(following-sibling::*) < 4 and (count(following-sibling::*) - 3) mod 2 = 0)]

p:not(:nth-last-child(-2n+5)) 37 === 37 .//p[not(count(following-sibling::*) < 5 and (count(following-sibling::*) - 4) mod 2 = 0)]

p:not(:nth-last-child(-3n+1)) 45 === 45 .//p[not(count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 3 = 0)]

p:not(:nth-last-child(-3n+2)) 45 === 45 .//p[not(count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 3 = 0)]

p:not(:nth-last-child(-3n+3)) 44 === 44 .//p[not(count(following-sibling::*) <= 2 and (count(following-sibling::*) - 2) mod 3 = 0)]

p:not(:nth-last-child(-3n+4)) 41 === 41 .//p[not(count(following-sibling::*) < 4 and (count(following-sibling::*) - 3) mod 3 = 0)]

p:not(:nth-last-child(-3n+5)) 41 === 41 .//p[not(count(following-sibling::*) < 5 and (count(following-sibling::*) - 4) mod 3 = 0)]

p:not(:nth-last-child(-4n+1)) 45 === 45 .//p[not(count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 4 = 0)]

p:not(:nth-last-child(-4n+2)) 45 === 45 .//p[not(count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 4 = 0)]

p:not(:nth-last-child(-4n+3)) 44 === 44 .//p[not(count(following-sibling::*) <= 2 and (count(following-sibling::*) - 2) mod 4 = 0)]

p:not(:nth-last-child(-4n+4)) 44 === 44 .//p[not(count(following-sibling::*) <= 3 and (count(following-sibling::*) - 3) mod 4 = 0)]

p:not(:nth-last-child(-4n+5)) 41 === 41 .//p[not(count(following-sibling::*) < 5 and (count(following-sibling::*) - 4) mod 4 = 0)]

p:not(:nth-last-child(-5n+1)) 45 === 45 .//p[not(count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 5 = 0)]

p:not(:nth-last-child(-5n+2)) 45 === 45 .//p[not(count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 5 = 0)]

p:not(:nth-last-child(-5n+3)) 44 === 44 .//p[not(count(following-sibling::*) <= 2 and (count(following-sibling::*) - 2) mod 5 = 0)]

p:not(:nth-last-child(-5n+4)) 44 === 44 .//p[not(count(following-sibling::*) <= 3 and (count(following-sibling::*) - 3) mod 5 = 0)]

p:not(:nth-last-child(-5n+5)) 44 === 44 .//p[not(count(following-sibling::*) <= 4 and (count(following-sibling::*) - 4) mod 5 = 0)]

not-nth-last-of-type.json

Results:

Passed: 107

Passed: 107

p:not(:nth-last-of-type(1)) 43 === 43 .//p[not(count(following-sibling::p) = 0)]

p:not(:nth-last-of-type(2)) 43 === 43 .//p[not(count(following-sibling::p) = 1)]

p:not(:nth-last-of-type(3)) 43 === 43 .//p[not(count(following-sibling::p) = 2)]

p:not(:nth-last-of-type(4)) 44 === 44 .//p[not(count(following-sibling::p) = 3)]

p:not(:nth-last-of-type(5)) 44 === 44 .//p[not(count(following-sibling::p) = 4)]

p:not(:nth-last-of-type(2n)) 26 === 26 .//p[not((count(following-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-last-of-type(3n)) 32 === 32 .//p[not((count(following-sibling::p) + 1) mod 3 = 0)]

p:not(:nth-last-of-type(4n)) 39 === 39 .//p[not((count(following-sibling::p) + 1) mod 4 = 0)]

p:not(:nth-last-of-type(5n)) 40 === 40 .//p[not((count(following-sibling::p) + 1) mod 5 = 0)]

p:not(:nth-last-of-type(odd)) 22 === 22 .//p[not((count(following-sibling::p) + 1) mod 2 = 1)]

p:not(:nth-last-of-type(n+2)) 5 === 5 .//p[not(count(following-sibling::p) >= 1)]

p:not(:nth-last-of-type(n+3)) 10 === 10 .//p[not(count(following-sibling::p) >= 2)]

p:not(:nth-last-of-type(n+4)) 15 === 15 .//p[not(count(following-sibling::p) >= 3)]

p:not(:nth-last-of-type(n+5)) 19 === 19 .//p[not(count(following-sibling::p) >= 4)]

p:not(:nth-last-of-type(even)) 26 === 26 .//p[not((count(following-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-last-of-type(0n+1)) 43 === 43 .//p[not(count(following-sibling::p) = 0)]

p:not(:nth-last-of-type(0n+2)) 43 === 43 .//p[not(count(following-sibling::p) = 1)]

p:not(:nth-last-of-type(0n+3)) 43 === 43 .//p[not(count(following-sibling::p) = 2)]

p:not(:nth-last-of-type(0n+4)) 44 === 44 .//p[not(count(following-sibling::p) = 3)]

p:not(:nth-last-of-type(0n+5)) 44 === 44 .//p[not(count(following-sibling::p) = 4)]

p:not(:nth-last-of-type(1n+2)) 5 === 5 .//p[not(count(following-sibling::p) >= 1)]

p:not(:nth-last-of-type(1n+3)) 10 === 10 .//p[not(count(following-sibling::p) >= 2)]

p:not(:nth-last-of-type(1n+4)) 15 === 15 .//p[not(count(following-sibling::p) >= 3)]

p:not(:nth-last-of-type(1n+5)) 19 === 19 .//p[not(count(following-sibling::p) >= 4)]

p:not(:nth-last-of-type(2n+0)) 26 === 26 .//p[not((count(following-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-last-of-type(2n-0)) 26 === 26 .//p[not((count(following-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-last-of-type(2n+1)) 22 === 22 .//p[not((count(following-sibling::p)) mod 2 = 0)]

p:not(:nth-last-of-type(2n-1)) 22 === 22 .//p[not((count(following-sibling::p) + 2) mod 2 = 0)]

p:not(:nth-last-of-type(2n+2)) 26 === 26 .//p[not(count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 2 = 0)]

p:not(:nth-last-of-type(2n-2)) 26 === 26 .//p[not((count(following-sibling::p) + 3) mod 2 = 0)]

p:not(:nth-last-of-type(2n+3)) 27 === 27 .//p[not(count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 2 = 0)]

p:not(:nth-last-of-type(2n-3)) 22 === 22 .//p[not((count(following-sibling::p) + 4) mod 2 = 0)]

p:not(:nth-last-of-type(2n+4)) 31 === 31 .//p[not(count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 2 = 0)]

p:not(:nth-last-of-type(2n-4)) 26 === 26 .//p[not((count(following-sibling::p) + 5) mod 2 = 0)]

p:not(:nth-last-of-type(2n+5)) 32 === 32 .//p[not(count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 2 = 0)]

p:not(:nth-last-of-type(2n-5)) 22 === 22 .//p[not((count(following-sibling::p) + 6) mod 2 = 0)]

p:not(:nth-last-of-type(3n+0)) 32 === 32 .//p[not((count(following-sibling::p) + 1) mod 3 = 0)]

p:not(:nth-last-of-type(3n-0)) 32 === 32 .//p[not((count(following-sibling::p) + 1) mod 3 = 0)]

p:not(:nth-last-of-type(3n+1)) 32 === 32 .//p[not((count(following-sibling::p)) mod 3 = 0)]

p:not(:nth-last-of-type(3n-1)) 32 === 32 .//p[not((count(following-sibling::p) + 2) mod 3 = 0)]

p:not(:nth-last-of-type(3n+2)) 32 === 32 .//p[not(count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 3 = 0)]

p:not(:nth-last-of-type(3n-2)) 32 === 32 .//p[not((count(following-sibling::p) + 3) mod 3 = 0)]

p:not(:nth-last-of-type(3n+3)) 32 === 32 .//p[not(count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 3 = 0)]

p:not(:nth-last-of-type(3n-3)) 32 === 32 .//p[not((count(following-sibling::p) + 4) mod 3 = 0)]

p:not(:nth-last-of-type(3n+4)) 37 === 37 .//p[not(count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 3 = 0)]

p:not(:nth-last-of-type(3n-4)) 32 === 32 .//p[not((count(following-sibling::p) + 5) mod 3 = 0)]

p:not(:nth-last-of-type(3n+5)) 37 === 37 .//p[not(count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 3 = 0)]

p:not(:nth-last-of-type(3n-5)) 32 === 32 .//p[not((count(following-sibling::p) + 6) mod 3 = 0)]

p:not(:nth-last-of-type(4n+0)) 39 === 39 .//p[not((count(following-sibling::p) + 1) mod 4 = 0)]

p:not(:nth-last-of-type(4n-0)) 39 === 39 .//p[not((count(following-sibling::p) + 1) mod 4 = 0)]

p:not(:nth-last-of-type(4n+1)) 34 === 34 .//p[not((count(following-sibling::p)) mod 4 = 0)]

p:not(:nth-last-of-type(4n-1)) 36 === 36 .//p[not((count(following-sibling::p) + 2) mod 4 = 0)]

p:not(:nth-last-of-type(4n+2)) 35 === 35 .//p[not(count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 4 = 0)]

p:not(:nth-last-of-type(4n-2)) 35 === 35 .//p[not((count(following-sibling::p) + 3) mod 4 = 0)]

p:not(:nth-last-of-type(4n+3)) 36 === 36 .//p[not(count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 4 = 0)]

p:not(:nth-last-of-type(4n-3)) 34 === 34 .//p[not((count(following-sibling::p) + 4) mod 4 = 0)]

p:not(:nth-last-of-type(4n+4)) 39 === 39 .//p[not(count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 4 = 0)]

p:not(:nth-last-of-type(4n-4)) 39 === 39 .//p[not((count(following-sibling::p) + 5) mod 4 = 0)]

p:not(:nth-last-of-type(4n+5)) 39 === 39 .//p[not(count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 4 = 0)]

p:not(:nth-last-of-type(4n-5)) 36 === 36 .//p[not((count(following-sibling::p) + 6) mod 4 = 0)]

p:not(:nth-last-of-type(5n+0)) 40 === 40 .//p[not((count(following-sibling::p) + 1) mod 5 = 0)]

p:not(:nth-last-of-type(5n-0)) 40 === 40 .//p[not((count(following-sibling::p) + 1) mod 5 = 0)]

p:not(:nth-last-of-type(5n+1)) 37 === 37 .//p[not((count(following-sibling::p)) mod 5 = 0)]

p:not(:nth-last-of-type(5n-1)) 39 === 39 .//p[not((count(following-sibling::p) + 2) mod 5 = 0)]

p:not(:nth-last-of-type(5n+2)) 38 === 38 .//p[not(count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 5 = 0)]

p:not(:nth-last-of-type(5n-2)) 38 === 38 .//p[not((count(following-sibling::p) + 3) mod 5 = 0)]

p:not(:nth-last-of-type(5n+3)) 38 === 38 .//p[not(count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 5 = 0)]

p:not(:nth-last-of-type(5n-3)) 38 === 38 .//p[not((count(following-sibling::p) + 4) mod 5 = 0)]

p:not(:nth-last-of-type(5n+4)) 39 === 39 .//p[not(count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 5 = 0)]

p:not(:nth-last-of-type(5n-4)) 37 === 37 .//p[not((count(following-sibling::p) + 5) mod 5 = 0)]

p:not(:nth-last-of-type(5n+5)) 40 === 40 .//p[not(count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 5 = 0)]

p:not(:nth-last-of-type(5n-5)) 40 === 40 .//p[not((count(following-sibling::p) + 6) mod 5 = 0)]

p:not(:nth-last-of-type(-n+1)) 43 === 43 .//p[not(count(following-sibling::p) <= 0)]

p:not(:nth-last-of-type(-n+2)) 38 === 38 .//p[not(count(following-sibling::p) <= 1)]

p:not(:nth-last-of-type(-n+3)) 33 === 33 .//p[not(count(following-sibling::p) <= 2)]

p:not(:nth-last-of-type(-n+4)) 29 === 29 .//p[not(count(following-sibling::p) <= 3)]

p:not(:nth-last-of-type(-n+5)) 25 === 25 .//p[not(count(following-sibling::p) <= 4)]

p:not(:nth-last-of-type(-0n+1)) 43 === 43 .//p[not(count(following-sibling::p) < 1)]

p:not(:nth-last-of-type(-0n+2)) 43 === 43 .//p[not(count(following-sibling::p) = 1)]

p:not(:nth-last-of-type(-0n+3)) 43 === 43 .//p[not(count(following-sibling::p) = 2)]

p:not(:nth-last-of-type(-0n+4)) 44 === 44 .//p[not(count(following-sibling::p) = 3)]

p:not(:nth-last-of-type(-0n+5)) 44 === 44 .//p[not(count(following-sibling::p) = 4)]

p:not(:nth-last-of-type(-1n+1)) 43 === 43 .//p[not(count(following-sibling::p) <= 0)]

p:not(:nth-last-of-type(-1n+2)) 38 === 38 .//p[not(count(following-sibling::p) < 2)]

p:not(:nth-last-of-type(-1n+3)) 33 === 33 .//p[not(count(following-sibling::p) < 3)]

p:not(:nth-last-of-type(-1n+4)) 29 === 29 .//p[not(count(following-sibling::p) < 4)]

p:not(:nth-last-of-type(-1n+5)) 25 === 25 .//p[not(count(following-sibling::p) < 5)]

p:not(:nth-last-of-type(-2n+1)) 43 === 43 .//p[not(count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 2 = 0)]

p:not(:nth-last-of-type(-2n+2)) 43 === 43 .//p[not(count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 2 = 0)]

p:not(:nth-last-of-type(-2n+3)) 38 === 38 .//p[not(count(following-sibling::p) < 3 and (count(following-sibling::p) - 2) mod 2 = 0)]

p:not(:nth-last-of-type(-2n+4)) 39 === 39 .//p[not(count(following-sibling::p) < 4 and (count(following-sibling::p) - 3) mod 2 = 0)]

p:not(:nth-last-of-type(-2n+5)) 34 === 34 .//p[not(count(following-sibling::p) < 5 and (count(following-sibling::p) - 4) mod 2 = 0)]

p:not(:nth-last-of-type(-3n+1)) 43 === 43 .//p[not(count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 3 = 0)]

p:not(:nth-last-of-type(-3n+2)) 43 === 43 .//p[not(count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 3 = 0)]

p:not(:nth-last-of-type(-3n+3)) 43 === 43 .//p[not(count(following-sibling::p) <= 2 and (count(following-sibling::p) - 2) mod 3 = 0)]

p:not(:nth-last-of-type(-3n+4)) 39 === 39 .//p[not(count(following-sibling::p) < 4 and (count(following-sibling::p) - 3) mod 3 = 0)]

p:not(:nth-last-of-type(-3n+5)) 39 === 39 .//p[not(count(following-sibling::p) < 5 and (count(following-sibling::p) - 4) mod 3 = 0)]

p:not(:nth-last-of-type(-4n+1)) 43 === 43 .//p[not(count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 4 = 0)]

p:not(:nth-last-of-type(-4n+2)) 43 === 43 .//p[not(count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 4 = 0)]

p:not(:nth-last-of-type(-4n+3)) 43 === 43 .//p[not(count(following-sibling::p) <= 2 and (count(following-sibling::p) - 2) mod 4 = 0)]

p:not(:nth-last-of-type(-4n+4)) 44 === 44 .//p[not(count(following-sibling::p) <= 3 and (count(following-sibling::p) - 3) mod 4 = 0)]

p:not(:nth-last-of-type(-4n+5)) 39 === 39 .//p[not(count(following-sibling::p) < 5 and (count(following-sibling::p) - 4) mod 4 = 0)]

p:not(:nth-last-of-type(-5n+1)) 43 === 43 .//p[not(count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 5 = 0)]

p:not(:nth-last-of-type(-5n+2)) 43 === 43 .//p[not(count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 5 = 0)]

p:not(:nth-last-of-type(-5n+3)) 43 === 43 .//p[not(count(following-sibling::p) <= 2 and (count(following-sibling::p) - 2) mod 5 = 0)]

p:not(:nth-last-of-type(-5n+4)) 44 === 44 .//p[not(count(following-sibling::p) <= 3 and (count(following-sibling::p) - 3) mod 5 = 0)]

p:not(:nth-last-of-type(-5n+5)) 44 === 44 .//p[not(count(following-sibling::p) <= 4 and (count(following-sibling::p) - 4) mod 5 = 0)]

not-nth-of-type.json

Results:

Passed: 107

Passed: 107

p:not(:nth-of-type(1)) 43 === 43 .//p[not(count(preceding-sibling::p) = 0)]

p:not(:nth-of-type(2)) 43 === 43 .//p[not(count(preceding-sibling::p) = 1)]

p:not(:nth-of-type(3)) 43 === 43 .//p[not(count(preceding-sibling::p) = 2)]

p:not(:nth-of-type(4)) 44 === 44 .//p[not(count(preceding-sibling::p) = 3)]

p:not(:nth-of-type(5)) 44 === 44 .//p[not(count(preceding-sibling::p) = 4)]

p:not(:nth-of-type(2n)) 26 === 26 .//p[not((count(preceding-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-of-type(3n)) 32 === 32 .//p[not((count(preceding-sibling::p) + 1) mod 3 = 0)]

p:not(:nth-of-type(4n)) 39 === 39 .//p[not((count(preceding-sibling::p) + 1) mod 4 = 0)]

p:not(:nth-of-type(5n)) 40 === 40 .//p[not((count(preceding-sibling::p) + 1) mod 5 = 0)]

p:not(:nth-of-type(odd)) 22 === 22 .//p[not((count(preceding-sibling::p) + 1) mod 2 = 1)]

p:not(:nth-of-type(n+2)) 5 === 5 .//p[not(count(preceding-sibling::p) >= 1)]

p:not(:nth-of-type(n+3)) 10 === 10 .//p[not(count(preceding-sibling::p) >= 2)]

p:not(:nth-of-type(n+4)) 15 === 15 .//p[not(count(preceding-sibling::p) >= 3)]

p:not(:nth-of-type(n+5)) 19 === 19 .//p[not(count(preceding-sibling::p) >= 4)]

p:not(:nth-of-type(even)) 26 === 26 .//p[not((count(preceding-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-of-type(0n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) = 0)]

p:not(:nth-of-type(0n+2)) 43 === 43 .//p[not(count(preceding-sibling::p) = 1)]

p:not(:nth-of-type(0n+3)) 43 === 43 .//p[not(count(preceding-sibling::p) = 2)]

p:not(:nth-of-type(0n+4)) 44 === 44 .//p[not(count(preceding-sibling::p) = 3)]

p:not(:nth-of-type(0n+5)) 44 === 44 .//p[not(count(preceding-sibling::p) = 4)]

p:not(:nth-of-type(1n+2)) 5 === 5 .//p[not(count(preceding-sibling::p) >= 1)]

p:not(:nth-of-type(1n+3)) 10 === 10 .//p[not(count(preceding-sibling::p) >= 2)]

p:not(:nth-of-type(1n+4)) 15 === 15 .//p[not(count(preceding-sibling::p) >= 3)]

p:not(:nth-of-type(1n+5)) 19 === 19 .//p[not(count(preceding-sibling::p) >= 4)]

p:not(:nth-of-type(2n+0)) 26 === 26 .//p[not((count(preceding-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-of-type(2n-0)) 26 === 26 .//p[not((count(preceding-sibling::p) + 1) mod 2 = 0)]

p:not(:nth-of-type(2n+1)) 22 === 22 .//p[not((count(preceding-sibling::p)) mod 2 = 0)]

p:not(:nth-of-type(2n-1)) 22 === 22 .//p[not((count(preceding-sibling::p) + 2) mod 2 = 0)]

p:not(:nth-of-type(2n+2)) 26 === 26 .//p[not(count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 2 = 0)]

p:not(:nth-of-type(2n-2)) 26 === 26 .//p[not((count(preceding-sibling::p) + 3) mod 2 = 0)]

p:not(:nth-of-type(2n+3)) 27 === 27 .//p[not(count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 2 = 0)]

p:not(:nth-of-type(2n-3)) 22 === 22 .//p[not((count(preceding-sibling::p) + 4) mod 2 = 0)]

p:not(:nth-of-type(2n+4)) 31 === 31 .//p[not(count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 2 = 0)]

p:not(:nth-of-type(2n-4)) 26 === 26 .//p[not((count(preceding-sibling::p) + 5) mod 2 = 0)]

p:not(:nth-of-type(2n+5)) 32 === 32 .//p[not(count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 2 = 0)]

p:not(:nth-of-type(2n-5)) 22 === 22 .//p[not((count(preceding-sibling::p) + 6) mod 2 = 0)]

p:not(:nth-of-type(3n+0)) 32 === 32 .//p[not((count(preceding-sibling::p) + 1) mod 3 = 0)]

p:not(:nth-of-type(3n-0)) 32 === 32 .//p[not((count(preceding-sibling::p) + 1) mod 3 = 0)]

p:not(:nth-of-type(3n+1)) 32 === 32 .//p[not((count(preceding-sibling::p)) mod 3 = 0)]

p:not(:nth-of-type(3n-1)) 32 === 32 .//p[not((count(preceding-sibling::p) + 2) mod 3 = 0)]

p:not(:nth-of-type(3n+2)) 32 === 32 .//p[not(count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 3 = 0)]

p:not(:nth-of-type(3n-2)) 32 === 32 .//p[not((count(preceding-sibling::p) + 3) mod 3 = 0)]

p:not(:nth-of-type(3n+3)) 32 === 32 .//p[not(count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 3 = 0)]

p:not(:nth-of-type(3n-3)) 32 === 32 .//p[not((count(preceding-sibling::p) + 4) mod 3 = 0)]

p:not(:nth-of-type(3n+4)) 37 === 37 .//p[not(count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 3 = 0)]

p:not(:nth-of-type(3n-4)) 32 === 32 .//p[not((count(preceding-sibling::p) + 5) mod 3 = 0)]

p:not(:nth-of-type(3n+5)) 37 === 37 .//p[not(count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 3 = 0)]

p:not(:nth-of-type(3n-5)) 32 === 32 .//p[not((count(preceding-sibling::p) + 6) mod 3 = 0)]

p:not(:nth-of-type(4n+0)) 39 === 39 .//p[not((count(preceding-sibling::p) + 1) mod 4 = 0)]

p:not(:nth-of-type(4n-0)) 39 === 39 .//p[not((count(preceding-sibling::p) + 1) mod 4 = 0)]

p:not(:nth-of-type(4n+1)) 34 === 34 .//p[not((count(preceding-sibling::p)) mod 4 = 0)]

p:not(:nth-of-type(4n-1)) 36 === 36 .//p[not((count(preceding-sibling::p) + 2) mod 4 = 0)]

p:not(:nth-of-type(4n+2)) 35 === 35 .//p[not(count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 4 = 0)]

p:not(:nth-of-type(4n-2)) 35 === 35 .//p[not((count(preceding-sibling::p) + 3) mod 4 = 0)]

p:not(:nth-of-type(4n+3)) 36 === 36 .//p[not(count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 4 = 0)]

p:not(:nth-of-type(4n-3)) 34 === 34 .//p[not((count(preceding-sibling::p) + 4) mod 4 = 0)]

p:not(:nth-of-type(4n+4)) 39 === 39 .//p[not(count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 4 = 0)]

p:not(:nth-of-type(4n-4)) 39 === 39 .//p[not((count(preceding-sibling::p) + 5) mod 4 = 0)]

p:not(:nth-of-type(4n+5)) 39 === 39 .//p[not(count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 4 = 0)]

p:not(:nth-of-type(4n-5)) 36 === 36 .//p[not((count(preceding-sibling::p) + 6) mod 4 = 0)]

p:not(:nth-of-type(5n+0)) 40 === 40 .//p[not((count(preceding-sibling::p) + 1) mod 5 = 0)]

p:not(:nth-of-type(5n-0)) 40 === 40 .//p[not((count(preceding-sibling::p) + 1) mod 5 = 0)]

p:not(:nth-of-type(5n+1)) 37 === 37 .//p[not((count(preceding-sibling::p)) mod 5 = 0)]

p:not(:nth-of-type(5n-1)) 39 === 39 .//p[not((count(preceding-sibling::p) + 2) mod 5 = 0)]

p:not(:nth-of-type(5n+2)) 38 === 38 .//p[not(count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 5 = 0)]

p:not(:nth-of-type(5n-2)) 38 === 38 .//p[not((count(preceding-sibling::p) + 3) mod 5 = 0)]

p:not(:nth-of-type(5n+3)) 38 === 38 .//p[not(count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 5 = 0)]

p:not(:nth-of-type(5n-3)) 38 === 38 .//p[not((count(preceding-sibling::p) + 4) mod 5 = 0)]

p:not(:nth-of-type(5n+4)) 39 === 39 .//p[not(count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 5 = 0)]

p:not(:nth-of-type(5n-4)) 37 === 37 .//p[not((count(preceding-sibling::p) + 5) mod 5 = 0)]

p:not(:nth-of-type(5n+5)) 40 === 40 .//p[not(count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 5 = 0)]

p:not(:nth-of-type(5n-5)) 40 === 40 .//p[not((count(preceding-sibling::p) + 6) mod 5 = 0)]

p:not(:nth-of-type(-n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 0)]

p:not(:nth-of-type(-n+2)) 38 === 38 .//p[not(count(preceding-sibling::p) <= 1)]

p:not(:nth-of-type(-n+3)) 33 === 33 .//p[not(count(preceding-sibling::p) <= 2)]

p:not(:nth-of-type(-n+4)) 29 === 29 .//p[not(count(preceding-sibling::p) <= 3)]

p:not(:nth-of-type(-n+5)) 25 === 25 .//p[not(count(preceding-sibling::p) <= 4)]

p:not(:nth-of-type(-0n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) = 0)]

p:not(:nth-of-type(-0n+2)) 43 === 43 .//p[not(count(preceding-sibling::p) = 1)]

p:not(:nth-of-type(-0n+3)) 43 === 43 .//p[not(count(preceding-sibling::p) = 2)]

p:not(:nth-of-type(-0n+4)) 44 === 44 .//p[not(count(preceding-sibling::p) = 3)]

p:not(:nth-of-type(-0n+5)) 44 === 44 .//p[not(count(preceding-sibling::p) = 4)]

p:not(:nth-of-type(-1n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 0)]

p:not(:nth-of-type(-1n+2)) 38 === 38 .//p[not(count(preceding-sibling::p) <= 1)]

p:not(:nth-of-type(-1n+3)) 33 === 33 .//p[not(count(preceding-sibling::p) <= 2)]

p:not(:nth-of-type(-1n+4)) 29 === 29 .//p[not(count(preceding-sibling::p) <= 3)]

p:not(:nth-of-type(-1n+5)) 25 === 25 .//p[not(count(preceding-sibling::p) <= 4)]

p:not(:nth-of-type(-2n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 2 = 0)]

p:not(:nth-of-type(-2n+2)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 2 = 0)]

p:not(:nth-of-type(-2n+3)) 38 === 38 .//p[not(count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 2 = 0)]

p:not(:nth-of-type(-2n+4)) 39 === 39 .//p[not(count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 2 = 0)]

p:not(:nth-of-type(-2n+5)) 34 === 34 .//p[not(count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 2 = 0)]

p:not(:nth-of-type(-3n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 3 = 0)]

p:not(:nth-of-type(-3n+2)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 3 = 0)]

p:not(:nth-of-type(-3n+3)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 3 = 0)]

p:not(:nth-of-type(-3n+4)) 39 === 39 .//p[not(count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 3 = 0)]

p:not(:nth-of-type(-3n+5)) 39 === 39 .//p[not(count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 3 = 0)]

p:not(:nth-of-type(-4n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 4 = 0)]

p:not(:nth-of-type(-4n+2)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 4 = 0)]

p:not(:nth-of-type(-4n+3)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 4 = 0)]

p:not(:nth-of-type(-4n+4)) 44 === 44 .//p[not(count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 4 = 0)]

p:not(:nth-of-type(-4n+5)) 39 === 39 .//p[not(count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 4 = 0)]

p:not(:nth-of-type(-5n+1)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 5 = 0)]

p:not(:nth-of-type(-5n+2)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 5 = 0)]

p:not(:nth-of-type(-5n+3)) 43 === 43 .//p[not(count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 5 = 0)]

p:not(:nth-of-type(-5n+4)) 44 === 44 .//p[not(count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 5 = 0)]

p:not(:nth-of-type(-5n+5)) 44 === 44 .//p[not(count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 5 = 0)]

nth-child.json

Results:

Passed: 125

Passed: 125

p:nth-child(1) 5 === 5 .//*[position() = 1]/self::p

p:nth-child(2) 4 === 4 .//*[position() = 2]/self::p

p:nth-child(3) 5 === 5 .//*[position() = 3]/self::p

p:nth-child(4) 5 === 5 .//*[position() = 4]/self::p

p:nth-child(5) 4 === 4 .//*[position() = 5]/self::p

p:nth-child(n) 52 === 52 .//p

p:nth-child(1n) 52 === 52 .//p

p:nth-child(2n) 25 === 25 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

p:nth-child(3n) 14 === 14 .//*[(count(preceding-sibling::*) + 1) mod 3 = 0]/self::p

p:nth-child(4n) 13 === 13 .//*[(count(preceding-sibling::*) + 1) mod 4 = 0]/self::p

p:nth-child(5n) 8 === 8 .//*[(count(preceding-sibling::*) + 1) mod 5 = 0]/self::p

p:nth-child(odd) 27 === 27 .//*[(count(preceding-sibling::*) + 1) mod 2 = 1]/self::p

p:nth-child(n+0) 52 === 52 .//p

p:nth-child(n-0) 52 === 52 .//p

p:nth-child(n+1) 52 === 52 .//p

p:nth-child(n-1) 52 === 52 .//p

p:nth-child(n+2) 47 === 47 .//*[position() >= 2]/self::p

p:nth-child(n-2) 52 === 52 .//p

p:nth-child(n+3) 43 === 43 .//*[position() >= 3]/self::p

p:nth-child(n-3) 52 === 52 .//p

p:nth-child(n+4) 38 === 38 .//*[position() >= 4]/self::p

p:nth-child(n-4) 52 === 52 .//p

p:nth-child(n+5) 33 === 33 .//*[position() >= 5]/self::p

p:nth-child(n-5) 52 === 52 .//p

p:nth-child(even) 25 === 25 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

p:nth-child(0n+1) 5 === 5 .//*[position() = 1]/self::p

p:nth-child(0n+2) 4 === 4 .//*[position() = 2]/self::p

p:nth-child(0n+3) 5 === 5 .//*[position() = 3]/self::p

p:nth-child(0n+4) 5 === 5 .//*[position() = 4]/self::p

p:nth-child(0n+5) 4 === 4 .//*[position() = 5]/self::p

p:nth-child(1n+0) 52 === 52 .//p

p:nth-child(1n-0) 52 === 52 .//p

p:nth-child(1n+1) 52 === 52 .//p

p:nth-child(1n-1) 52 === 52 .//p

p:nth-child(1n+2) 47 === 47 .//*[position() >= 2]/self::p

p:nth-child(1n-2) 52 === 52 .//p

p:nth-child(1n+3) 43 === 43 .//*[position() >= 3]/self::p

p:nth-child(1n-3) 52 === 52 .//p

p:nth-child(1n+4) 38 === 38 .//*[position() >= 4]/self::p

p:nth-child(1n-4) 52 === 52 .//p

p:nth-child(1n+5) 33 === 33 .//*[position() >= 5]/self::p

p:nth-child(1n-5) 52 === 52 .//p

p:nth-child(2n+0) 25 === 25 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

p:nth-child(2n-0) 25 === 25 .//*[(count(preceding-sibling::*) + 1) mod 2 = 0]/self::p

p:nth-child(2n+1) 27 === 27 .//*[(count(preceding-sibling::*)) mod 2 = 0]/self::p

p:nth-child(2n-1) 27 === 27 .//*[(count(preceding-sibling::*) + 2) mod 2 = 0]/self::p

p:nth-child(2n+2) 25 === 25 .//*[position() >= 2 and (count(preceding-sibling::*) - 1) mod 2 = 0]/self::p

p:nth-child(2n-2) 25 === 25 .//*[(count(preceding-sibling::*) + 3) mod 2 = 0]/self::p

p:nth-child(2n+3) 22 === 22 .//*[position() >= 3 and (count(preceding-sibling::*) - 2) mod 2 = 0]/self::p

p:nth-child(2n-3) 27 === 27 .//*[(count(preceding-sibling::*) + 4) mod 2 = 0]/self::p

p:nth-child(2n+4) 21 === 21 .//*[position() >= 4 and (count(preceding-sibling::*) - 3) mod 2 = 0]/self::p

p:nth-child(2n-4) 25 === 25 .//*[(count(preceding-sibling::*) + 5) mod 2 = 0]/self::p

p:nth-child(2n+5) 17 === 17 .//*[position() >= 5 and (count(preceding-sibling::*) - 4) mod 2 = 0]/self::p

p:nth-child(2n-5) 27 === 27 .//*[(count(preceding-sibling::*) + 6) mod 2 = 0]/self::p

p:nth-child(3n+0) 14 === 14 .//*[(count(preceding-sibling::*) + 1) mod 3 = 0]/self::p

p:nth-child(3n-0) 14 === 14 .//*[(count(preceding-sibling::*) + 1) mod 3 = 0]/self::p

p:nth-child(3n+1) 20 === 20 .//*[(count(preceding-sibling::*)) mod 3 = 0]/self::p

p:nth-child(3n-1) 18 === 18 .//*[(count(preceding-sibling::*) + 2) mod 3 = 0]/self::p

p:nth-child(3n+2) 18 === 18 .//*[position() >= 2 and (count(preceding-sibling::*) - 1) mod 3 = 0]/self::p

p:nth-child(3n-2) 20 === 20 .//*[(count(preceding-sibling::*) + 3) mod 3 = 0]/self::p

p:nth-child(3n+3) 14 === 14 .//*[position() >= 3 and (count(preceding-sibling::*) - 2) mod 3 = 0]/self::p

p:nth-child(3n-3) 14 === 14 .//*[(count(preceding-sibling::*) + 4) mod 3 = 0]/self::p

p:nth-child(3n+4) 15 === 15 .//*[position() >= 4 and (count(preceding-sibling::*) - 3) mod 3 = 0]/self::p

p:nth-child(3n-4) 18 === 18 .//*[(count(preceding-sibling::*) + 5) mod 3 = 0]/self::p

p:nth-child(3n+5) 14 === 14 .//*[position() >= 5 and (count(preceding-sibling::*) - 4) mod 3 = 0]/self::p

p:nth-child(3n-5) 20 === 20 .//*[(count(preceding-sibling::*) + 6) mod 3 = 0]/self::p

p:nth-child(4n+0) 13 === 13 .//*[(count(preceding-sibling::*) + 1) mod 4 = 0]/self::p

p:nth-child(4n-0) 13 === 13 .//*[(count(preceding-sibling::*) + 1) mod 4 = 0]/self::p

p:nth-child(4n+1) 14 === 14 .//*[(count(preceding-sibling::*)) mod 4 = 0]/self::p

p:nth-child(4n-1) 13 === 13 .//*[(count(preceding-sibling::*) + 2) mod 4 = 0]/self::p

p:nth-child(4n+2) 12 === 12 .//*[position() >= 2 and (count(preceding-sibling::*) - 1) mod 4 = 0]/self::p

p:nth-child(4n-2) 12 === 12 .//*[(count(preceding-sibling::*) + 3) mod 4 = 0]/self::p

p:nth-child(4n+3) 13 === 13 .//*[position() >= 3 and (count(preceding-sibling::*) - 2) mod 4 = 0]/self::p

p:nth-child(4n-3) 14 === 14 .//*[(count(preceding-sibling::*) + 4) mod 4 = 0]/self::p

p:nth-child(4n+4) 13 === 13 .//*[position() >= 4 and (count(preceding-sibling::*) - 3) mod 4 = 0]/self::p

p:nth-child(4n-4) 13 === 13 .//*[(count(preceding-sibling::*) + 5) mod 4 = 0]/self::p

p:nth-child(4n+5) 9 === 9 .//*[position() >= 5 and (count(preceding-sibling::*) - 4) mod 4 = 0]/self::p

p:nth-child(4n-5) 13 === 13 .//*[(count(preceding-sibling::*) + 6) mod 4 = 0]/self::p

p:nth-child(5n+0) 8 === 8 .//*[(count(preceding-sibling::*) + 1) mod 5 = 0]/self::p

p:nth-child(5n-0) 8 === 8 .//*[(count(preceding-sibling::*) + 1) mod 5 = 0]/self::p

p:nth-child(5n+1) 12 === 12 .//*[(count(preceding-sibling::*)) mod 5 = 0]/self::p

p:nth-child(5n-1) 9 === 9 .//*[(count(preceding-sibling::*) + 2) mod 5 = 0]/self::p

p:nth-child(5n+2) 12 === 12 .//*[position() >= 2 and (count(preceding-sibling::*) - 1) mod 5 = 0]/self::p

p:nth-child(5n-2) 11 === 11 .//*[(count(preceding-sibling::*) + 3) mod 5 = 0]/self::p

p:nth-child(5n+3) 11 === 11 .//*[position() >= 3 and (count(preceding-sibling::*) - 2) mod 5 = 0]/self::p

p:nth-child(5n-3) 12 === 12 .//*[(count(preceding-sibling::*) + 4) mod 5 = 0]/self::p

p:nth-child(5n+4) 9 === 9 .//*[position() >= 4 and (count(preceding-sibling::*) - 3) mod 5 = 0]/self::p

p:nth-child(5n-4) 12 === 12 .//*[(count(preceding-sibling::*) + 5) mod 5 = 0]/self::p

p:nth-child(5n+5) 8 === 8 .//*[position() >= 5 and (count(preceding-sibling::*) - 4) mod 5 = 0]/self::p

p:nth-child(5n-5) 8 === 8 .//*[(count(preceding-sibling::*) + 6) mod 5 = 0]/self::p

p:nth-child(-n+1) 5 === 5 .//*[position() <= 1]/self::p

p:nth-child(-n+2) 9 === 9 .//*[position() <= 2]/self::p

p:nth-child(-n+3) 14 === 14 .//*[position() <= 3]/self::p

p:nth-child(-n+4) 19 === 19 .//*[position() <= 4]/self::p

p:nth-child(-n+5) 23 === 23 .//*[position() <= 5]/self::p

p:nth-child(-0n+1) 5 === 5 .//*[position() = 1]/self::p

p:nth-child(-0n+2) 4 === 4 .//*[position() = 2]/self::p

p:nth-child(-0n+3) 5 === 5 .//*[position() = 3]/self::p

p:nth-child(-0n+4) 5 === 5 .//*[position() = 4]/self::p

p:nth-child(-0n+5) 4 === 4 .//*[position() = 5]/self::p

p:nth-child(-1n+1) 5 === 5 .//*[position() <= 1]/self::p

p:nth-child(-1n+2) 9 === 9 .//*[position() <= 2]/self::p

p:nth-child(-1n+3) 14 === 14 .//*[position() <= 3]/self::p

p:nth-child(-1n+4) 19 === 19 .//*[position() <= 4]/self::p

p:nth-child(-1n+5) 23 === 23 .//*[position() <= 5]/self::p

p:nth-child(-2n+1) 5 === 5 .//*[position() <= 1 and (count(preceding-sibling::*)) mod 2 = 0]/self::p

p:nth-child(-2n+2) 4 === 4 .//*[position() <= 2 and (count(preceding-sibling::*) - 1) mod 2 = 0]/self::p

p:nth-child(-2n+3) 10 === 10 .//*[position() <= 3 and (count(preceding-sibling::*) - 2) mod 2 = 0]/self::p

p:nth-child(-2n+4) 9 === 9 .//*[position() <= 4 and (count(preceding-sibling::*) - 3) mod 2 = 0]/self::p

p:nth-child(-2n+5) 14 === 14 .//*[position() <= 5 and (count(preceding-sibling::*) - 4) mod 2 = 0]/self::p

p:nth-child(-3n+1) 5 === 5 .//*[position() <= 1 and (count(preceding-sibling::*)) mod 3 = 0]/self::p

p:nth-child(-3n+2) 4 === 4 .//*[position() <= 2 and (count(preceding-sibling::*) - 1) mod 3 = 0]/self::p

p:nth-child(-3n+3) 5 === 5 .//*[position() <= 3 and (count(preceding-sibling::*) - 2) mod 3 = 0]/self::p

p:nth-child(-3n+4) 10 === 10 .//*[position() <= 4 and (count(preceding-sibling::*) - 3) mod 3 = 0]/self::p

p:nth-child(-3n+5) 8 === 8 .//*[position() <= 5 and (count(preceding-sibling::*) - 4) mod 3 = 0]/self::p

p:nth-child(-4n+1) 5 === 5 .//*[position() <= 1 and (count(preceding-sibling::*)) mod 4 = 0]/self::p

p:nth-child(-4n+2) 4 === 4 .//*[position() <= 2 and (count(preceding-sibling::*) - 1) mod 4 = 0]/self::p

p:nth-child(-4n+3) 5 === 5 .//*[position() <= 3 and (count(preceding-sibling::*) - 2) mod 4 = 0]/self::p

p:nth-child(-4n+4) 5 === 5 .//*[position() <= 4 and (count(preceding-sibling::*) - 3) mod 4 = 0]/self::p

p:nth-child(-4n+5) 9 === 9 .//*[position() <= 5 and (count(preceding-sibling::*) - 4) mod 4 = 0]/self::p

p:nth-child(-5n+1) 5 === 5 .//*[position() <= 1 and (count(preceding-sibling::*)) mod 5 = 0]/self::p

p:nth-child(-5n+2) 4 === 4 .//*[position() <= 2 and (count(preceding-sibling::*) - 1) mod 5 = 0]/self::p

p:nth-child(-5n+3) 5 === 5 .//*[position() <= 3 and (count(preceding-sibling::*) - 2) mod 5 = 0]/self::p

p:nth-child(-5n+4) 5 === 5 .//*[position() <= 4 and (count(preceding-sibling::*) - 3) mod 5 = 0]/self::p

p:nth-child(-5n+5) 4 === 4 .//*[position() <= 5 and (count(preceding-sibling::*) - 4) mod 5 = 0]/self::p

nth-last-child.json

Results:

Passed: 125

Passed: 125

p:nth-last-child(1) 3 === 3 .//p[count(following-sibling::*) = 0]

p:nth-last-child(2) 3 === 3 .//p[count(following-sibling::*) = 1]

p:nth-last-child(3) 4 === 4 .//p[count(following-sibling::*) = 2]

p:nth-last-child(4) 4 === 4 .//p[count(following-sibling::*) = 3]

p:nth-last-child(5) 4 === 4 .//p[count(following-sibling::*) = 4]

p:nth-last-child(n) 52 === 52 .//p

p:nth-last-child(1n) 52 === 52 .//p

p:nth-last-child(2n) 25 === 25 .//p[(count(following-sibling::*) + 1) mod 2 = 0]

p:nth-last-child(3n) 18 === 18 .//p[(count(following-sibling::*) + 1) mod 3 = 0]

p:nth-last-child(4n) 12 === 12 .//p[(count(following-sibling::*) + 1) mod 4 = 0]

p:nth-last-child(5n) 9 === 9 .//p[(count(following-sibling::*) + 1) mod 5 = 0]

p:nth-last-child(odd) 27 === 27 .//p[(count(following-sibling::*) + 1) mod 2 = 1]

p:nth-last-child(n+0) 52 === 52 .//p

p:nth-last-child(n-0) 52 === 52 .//p

p:nth-last-child(n+1) 52 === 52 .//p

p:nth-last-child(n-1) 52 === 52 .//p

p:nth-last-child(n+2) 49 === 49 .//p[count(following-sibling::*) >= 1]

p:nth-last-child(n-2) 52 === 52 .//p

p:nth-last-child(n+3) 46 === 46 .//p[count(following-sibling::*) >= 2]

p:nth-last-child(n-3) 52 === 52 .//p

p:nth-last-child(n+4) 42 === 42 .//p[count(following-sibling::*) >= 3]

p:nth-last-child(n-4) 52 === 52 .//p

p:nth-last-child(n+5) 38 === 38 .//p[count(following-sibling::*) >= 4]

p:nth-last-child(n-5) 52 === 52 .//p

p:nth-last-child(even) 25 === 25 .//p[(count(following-sibling::*) + 1) mod 2 = 0]

p:nth-last-child(0n+1) 3 === 3 .//p[count(following-sibling::*) = 0]

p:nth-last-child(0n+2) 3 === 3 .//p[count(following-sibling::*) = 1]

p:nth-last-child(0n+3) 4 === 4 .//p[count(following-sibling::*) = 2]

p:nth-last-child(0n+4) 4 === 4 .//p[count(following-sibling::*) = 3]

p:nth-last-child(0n+5) 4 === 4 .//p[count(following-sibling::*) = 4]

p:nth-last-child(1n+0) 52 === 52 .//p

p:nth-last-child(1n-0) 52 === 52 .//p

p:nth-last-child(1n+1) 52 === 52 .//p

p:nth-last-child(1n-1) 52 === 52 .//p

p:nth-last-child(1n+2) 49 === 49 .//p[count(following-sibling::*) >= 1]

p:nth-last-child(1n-2) 52 === 52 .//p

p:nth-last-child(1n+3) 46 === 46 .//p[count(following-sibling::*) >= 2]

p:nth-last-child(1n-3) 52 === 52 .//p

p:nth-last-child(1n+4) 42 === 42 .//p[count(following-sibling::*) >= 3]

p:nth-last-child(1n-4) 52 === 52 .//p

p:nth-last-child(1n+5) 38 === 38 .//p[count(following-sibling::*) >= 4]

p:nth-last-child(1n-5) 52 === 52 .//p

p:nth-last-child(2n+0) 25 === 25 .//p[(count(following-sibling::*) + 1) mod 2 = 0]

p:nth-last-child(2n-0) 25 === 25 .//p[(count(following-sibling::*) + 1) mod 2 = 0]

p:nth-last-child(2n+1) 27 === 27 .//p[(count(following-sibling::*)) mod 2 = 0]

p:nth-last-child(2n-1) 27 === 27 .//p[(count(following-sibling::*) + 2) mod 2 = 0]

p:nth-last-child(2n+2) 25 === 25 .//p[count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 2 = 0]

p:nth-last-child(2n-2) 25 === 25 .//p[(count(following-sibling::*) + 3) mod 2 = 0]

p:nth-last-child(2n+3) 24 === 24 .//p[count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 2 = 0]

p:nth-last-child(2n-3) 27 === 27 .//p[(count(following-sibling::*) + 4) mod 2 = 0]

p:nth-last-child(2n+4) 22 === 22 .//p[count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 2 = 0]

p:nth-last-child(2n-4) 25 === 25 .//p[(count(following-sibling::*) + 5) mod 2 = 0]

p:nth-last-child(2n+5) 20 === 20 .//p[count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 2 = 0]

p:nth-last-child(2n-5) 27 === 27 .//p[(count(following-sibling::*) + 6) mod 2 = 0]

p:nth-last-child(3n+0) 18 === 18 .//p[(count(following-sibling::*) + 1) mod 3 = 0]

p:nth-last-child(3n-0) 18 === 18 .//p[(count(following-sibling::*) + 1) mod 3 = 0]

p:nth-last-child(3n+1) 18 === 18 .//p[(count(following-sibling::*)) mod 3 = 0]

p:nth-last-child(3n-1) 16 === 16 .//p[(count(following-sibling::*) + 2) mod 3 = 0]

p:nth-last-child(3n+2) 16 === 16 .//p[count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 3 = 0]

p:nth-last-child(3n-2) 18 === 18 .//p[(count(following-sibling::*) + 3) mod 3 = 0]

p:nth-last-child(3n+3) 18 === 18 .//p[count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 3 = 0]

p:nth-last-child(3n-3) 18 === 18 .//p[(count(following-sibling::*) + 4) mod 3 = 0]

p:nth-last-child(3n+4) 15 === 15 .//p[count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 3 = 0]

p:nth-last-child(3n-4) 16 === 16 .//p[(count(following-sibling::*) + 5) mod 3 = 0]

p:nth-last-child(3n+5) 13 === 13 .//p[count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 3 = 0]

p:nth-last-child(3n-5) 18 === 18 .//p[(count(following-sibling::*) + 6) mod 3 = 0]

p:nth-last-child(4n+0) 12 === 12 .//p[(count(following-sibling::*) + 1) mod 4 = 0]

p:nth-last-child(4n-0) 12 === 12 .//p[(count(following-sibling::*) + 1) mod 4 = 0]

p:nth-last-child(4n+1) 14 === 14 .//p[(count(following-sibling::*)) mod 4 = 0]

p:nth-last-child(4n-1) 13 === 13 .//p[(count(following-sibling::*) + 2) mod 4 = 0]

p:nth-last-child(4n+2) 13 === 13 .//p[count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 4 = 0]

p:nth-last-child(4n-2) 13 === 13 .//p[(count(following-sibling::*) + 3) mod 4 = 0]

p:nth-last-child(4n+3) 13 === 13 .//p[count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 4 = 0]

p:nth-last-child(4n-3) 14 === 14 .//p[(count(following-sibling::*) + 4) mod 4 = 0]

p:nth-last-child(4n+4) 12 === 12 .//p[count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 4 = 0]

p:nth-last-child(4n-4) 12 === 12 .//p[(count(following-sibling::*) + 5) mod 4 = 0]

p:nth-last-child(4n+5) 11 === 11 .//p[count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 4 = 0]

p:nth-last-child(4n-5) 13 === 13 .//p[(count(following-sibling::*) + 6) mod 4 = 0]

p:nth-last-child(5n+0) 9 === 9 .//p[(count(following-sibling::*) + 1) mod 5 = 0]

p:nth-last-child(5n-0) 9 === 9 .//p[(count(following-sibling::*) + 1) mod 5 = 0]

p:nth-last-child(5n+1) 10 === 10 .//p[(count(following-sibling::*)) mod 5 = 0]

p:nth-last-child(5n-1) 11 === 11 .//p[(count(following-sibling::*) + 2) mod 5 = 0]

p:nth-last-child(5n+2) 11 === 11 .//p[count(following-sibling::*) >= 1 and (count(following-sibling::*) - 1) mod 5 = 0]

p:nth-last-child(5n-2) 11 === 11 .//p[(count(following-sibling::*) + 3) mod 5 = 0]

p:nth-last-child(5n+3) 11 === 11 .//p[count(following-sibling::*) >= 2 and (count(following-sibling::*) - 2) mod 5 = 0]

p:nth-last-child(5n-3) 11 === 11 .//p[(count(following-sibling::*) + 4) mod 5 = 0]

p:nth-last-child(5n+4) 11 === 11 .//p[count(following-sibling::*) >= 3 and (count(following-sibling::*) - 3) mod 5 = 0]

p:nth-last-child(5n-4) 10 === 10 .//p[(count(following-sibling::*) + 5) mod 5 = 0]

p:nth-last-child(5n+5) 9 === 9 .//p[count(following-sibling::*) >= 4 and (count(following-sibling::*) - 4) mod 5 = 0]

p:nth-last-child(5n-5) 9 === 9 .//p[(count(following-sibling::*) + 6) mod 5 = 0]

p:nth-last-child(-n+1) 3 === 3 .//p[count(following-sibling::*) <= 0]

p:nth-last-child(-n+2) 6 === 6 .//p[count(following-sibling::*) <= 1]

p:nth-last-child(-n+3) 10 === 10 .//p[count(following-sibling::*) <= 2]

p:nth-last-child(-n+4) 14 === 14 .//p[count(following-sibling::*) <= 3]

p:nth-last-child(-n+5) 18 === 18 .//p[count(following-sibling::*) <= 4]

p:nth-last-child(-0n+1) 3 === 3 .//p[count(following-sibling::*) < 1]

p:nth-last-child(-0n+2) 3 === 3 .//p[count(following-sibling::*) = 1]

p:nth-last-child(-0n+3) 4 === 4 .//p[count(following-sibling::*) = 2]

p:nth-last-child(-0n+4) 4 === 4 .//p[count(following-sibling::*) = 3]

p:nth-last-child(-0n+5) 4 === 4 .//p[count(following-sibling::*) = 4]

p:nth-last-child(-1n+1) 3 === 3 .//p[count(following-sibling::*) <= 0]

p:nth-last-child(-1n+2) 6 === 6 .//p[count(following-sibling::*) < 2]

p:nth-last-child(-1n+3) 10 === 10 .//p[count(following-sibling::*) < 3]

p:nth-last-child(-1n+4) 14 === 14 .//p[count(following-sibling::*) < 4]

p:nth-last-child(-1n+5) 18 === 18 .//p[count(following-sibling::*) < 5]

p:nth-last-child(-2n+1) 3 === 3 .//p[count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 2 = 0]

p:nth-last-child(-2n+2) 3 === 3 .//p[count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 2 = 0]

p:nth-last-child(-2n+3) 7 === 7 .//p[count(following-sibling::*) < 3 and (count(following-sibling::*) - 2) mod 2 = 0]

p:nth-last-child(-2n+4) 7 === 7 .//p[count(following-sibling::*) < 4 and (count(following-sibling::*) - 3) mod 2 = 0]

p:nth-last-child(-2n+5) 11 === 11 .//p[count(following-sibling::*) < 5 and (count(following-sibling::*) - 4) mod 2 = 0]

p:nth-last-child(-3n+1) 3 === 3 .//p[count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 3 = 0]

p:nth-last-child(-3n+2) 3 === 3 .//p[count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 3 = 0]

p:nth-last-child(-3n+3) 4 === 4 .//p[count(following-sibling::*) <= 2 and (count(following-sibling::*) - 2) mod 3 = 0]

p:nth-last-child(-3n+4) 7 === 7 .//p[count(following-sibling::*) < 4 and (count(following-sibling::*) - 3) mod 3 = 0]

p:nth-last-child(-3n+5) 7 === 7 .//p[count(following-sibling::*) < 5 and (count(following-sibling::*) - 4) mod 3 = 0]

p:nth-last-child(-4n+1) 3 === 3 .//p[count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 4 = 0]

p:nth-last-child(-4n+2) 3 === 3 .//p[count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 4 = 0]

p:nth-last-child(-4n+3) 4 === 4 .//p[count(following-sibling::*) <= 2 and (count(following-sibling::*) - 2) mod 4 = 0]

p:nth-last-child(-4n+4) 4 === 4 .//p[count(following-sibling::*) <= 3 and (count(following-sibling::*) - 3) mod 4 = 0]

p:nth-last-child(-4n+5) 7 === 7 .//p[count(following-sibling::*) < 5 and (count(following-sibling::*) - 4) mod 4 = 0]

p:nth-last-child(-5n+1) 3 === 3 .//p[count(following-sibling::*) <= 0 and (count(following-sibling::*)) mod 5 = 0]

p:nth-last-child(-5n+2) 3 === 3 .//p[count(following-sibling::*) <= 1 and (count(following-sibling::*) - 1) mod 5 = 0]

p:nth-last-child(-5n+3) 4 === 4 .//p[count(following-sibling::*) <= 2 and (count(following-sibling::*) - 2) mod 5 = 0]

p:nth-last-child(-5n+4) 4 === 4 .//p[count(following-sibling::*) <= 3 and (count(following-sibling::*) - 3) mod 5 = 0]

p:nth-last-child(-5n+5) 4 === 4 .//p[count(following-sibling::*) <= 4 and (count(following-sibling::*) - 4) mod 5 = 0]

nth-last-of-type.json

Results:

Passed: 125

Passed: 125

p:nth-last-of-type(1) 5 === 5 .//p[count(following-sibling::p) = 0]

p:nth-last-of-type(2) 5 === 5 .//p[count(following-sibling::p) = 1]

p:nth-last-of-type(3) 5 === 5 .//p[count(following-sibling::p) = 2]

p:nth-last-of-type(4) 4 === 4 .//p[count(following-sibling::p) = 3]

p:nth-last-of-type(5) 4 === 4 .//p[count(following-sibling::p) = 4]

p:nth-last-of-type(n) 52 === 52 .//p

p:nth-last-of-type(1n) 52 === 52 .//p

p:nth-last-of-type(2n) 24 === 24 .//p[(count(following-sibling::p) + 1) mod 2 = 0]

p:nth-last-of-type(3n) 17 === 17 .//p[(count(following-sibling::p) + 1) mod 3 = 0]

p:nth-last-of-type(4n) 10 === 10 .//p[(count(following-sibling::p) + 1) mod 4 = 0]

p:nth-last-of-type(5n) 9 === 9 .//p[(count(following-sibling::p) + 1) mod 5 = 0]

p:nth-last-of-type(odd) 28 === 28 .//p[(count(following-sibling::p) + 1) mod 2 = 1]

p:nth-last-of-type(n+0) 52 === 52 .//p

p:nth-last-of-type(n-0) 52 === 52 .//p

p:nth-last-of-type(n+1) 52 === 52 .//p

p:nth-last-of-type(n-1) 52 === 52 .//p

p:nth-last-of-type(n+2) 47 === 47 .//p[count(following-sibling::p) >= 1]

p:nth-last-of-type(n-2) 52 === 52 .//p

p:nth-last-of-type(n+3) 42 === 42 .//p[count(following-sibling::p) >= 2]

p:nth-last-of-type(n-3) 52 === 52 .//p

p:nth-last-of-type(n+4) 37 === 37 .//p[count(following-sibling::p) >= 3]

p:nth-last-of-type(n-4) 52 === 52 .//p

p:nth-last-of-type(n+5) 33 === 33 .//p[count(following-sibling::p) >= 4]

p:nth-last-of-type(n-5) 52 === 52 .//p

p:nth-last-of-type(even) 24 === 24 .//p[(count(following-sibling::p) + 1) mod 2 = 0]

p:nth-last-of-type(0n+1) 5 === 5 .//p[count(following-sibling::p) = 0]

p:nth-last-of-type(0n+2) 5 === 5 .//p[count(following-sibling::p) = 1]

p:nth-last-of-type(0n+3) 5 === 5 .//p[count(following-sibling::p) = 2]

p:nth-last-of-type(0n+4) 4 === 4 .//p[count(following-sibling::p) = 3]

p:nth-last-of-type(0n+5) 4 === 4 .//p[count(following-sibling::p) = 4]

p:nth-last-of-type(1n+0) 52 === 52 .//p

p:nth-last-of-type(1n-0) 52 === 52 .//p

p:nth-last-of-type(1n+1) 52 === 52 .//p

p:nth-last-of-type(1n-1) 52 === 52 .//p

p:nth-last-of-type(1n+2) 47 === 47 .//p[count(following-sibling::p) >= 1]

p:nth-last-of-type(1n-2) 52 === 52 .//p

p:nth-last-of-type(1n+3) 42 === 42 .//p[count(following-sibling::p) >= 2]

p:nth-last-of-type(1n-3) 52 === 52 .//p

p:nth-last-of-type(1n+4) 37 === 37 .//p[count(following-sibling::p) >= 3]

p:nth-last-of-type(1n-4) 52 === 52 .//p

p:nth-last-of-type(1n+5) 33 === 33 .//p[count(following-sibling::p) >= 4]

p:nth-last-of-type(1n-5) 52 === 52 .//p

p:nth-last-of-type(2n+0) 24 === 24 .//p[(count(following-sibling::p) + 1) mod 2 = 0]

p:nth-last-of-type(2n-0) 24 === 24 .//p[(count(following-sibling::p) + 1) mod 2 = 0]

p:nth-last-of-type(2n+1) 28 === 28 .//p[(count(following-sibling::p)) mod 2 = 0]

p:nth-last-of-type(2n-1) 28 === 28 .//p[(count(following-sibling::p) + 2) mod 2 = 0]

p:nth-last-of-type(2n+2) 24 === 24 .//p[count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 2 = 0]

p:nth-last-of-type(2n-2) 24 === 24 .//p[(count(following-sibling::p) + 3) mod 2 = 0]

p:nth-last-of-type(2n+3) 23 === 23 .//p[count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 2 = 0]

p:nth-last-of-type(2n-3) 28 === 28 .//p[(count(following-sibling::p) + 4) mod 2 = 0]

p:nth-last-of-type(2n+4) 19 === 19 .//p[count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 2 = 0]

p:nth-last-of-type(2n-4) 24 === 24 .//p[(count(following-sibling::p) + 5) mod 2 = 0]

p:nth-last-of-type(2n+5) 18 === 18 .//p[count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 2 = 0]

p:nth-last-of-type(2n-5) 28 === 28 .//p[(count(following-sibling::p) + 6) mod 2 = 0]

p:nth-last-of-type(3n+0) 17 === 17 .//p[(count(following-sibling::p) + 1) mod 3 = 0]

p:nth-last-of-type(3n-0) 17 === 17 .//p[(count(following-sibling::p) + 1) mod 3 = 0]

p:nth-last-of-type(3n+1) 18 === 18 .//p[(count(following-sibling::p)) mod 3 = 0]

p:nth-last-of-type(3n-1) 17 === 17 .//p[(count(following-sibling::p) + 2) mod 3 = 0]

p:nth-last-of-type(3n+2) 17 === 17 .//p[count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 3 = 0]

p:nth-last-of-type(3n-2) 18 === 18 .//p[(count(following-sibling::p) + 3) mod 3 = 0]

p:nth-last-of-type(3n+3) 17 === 17 .//p[count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 3 = 0]

p:nth-last-of-type(3n-3) 17 === 17 .//p[(count(following-sibling::p) + 4) mod 3 = 0]

p:nth-last-of-type(3n+4) 13 === 13 .//p[count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 3 = 0]

p:nth-last-of-type(3n-4) 17 === 17 .//p[(count(following-sibling::p) + 5) mod 3 = 0]

p:nth-last-of-type(3n+5) 12 === 12 .//p[count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 3 = 0]

p:nth-last-of-type(3n-5) 18 === 18 .//p[(count(following-sibling::p) + 6) mod 3 = 0]

p:nth-last-of-type(4n+0) 10 === 10 .//p[(count(following-sibling::p) + 1) mod 4 = 0]

p:nth-last-of-type(4n-0) 10 === 10 .//p[(count(following-sibling::p) + 1) mod 4 = 0]

p:nth-last-of-type(4n+1) 15 === 15 .//p[(count(following-sibling::p)) mod 4 = 0]

p:nth-last-of-type(4n-1) 13 === 13 .//p[(count(following-sibling::p) + 2) mod 4 = 0]

p:nth-last-of-type(4n+2) 14 === 14 .//p[count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 4 = 0]

p:nth-last-of-type(4n-2) 14 === 14 .//p[(count(following-sibling::p) + 3) mod 4 = 0]

p:nth-last-of-type(4n+3) 13 === 13 .//p[count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 4 = 0]

p:nth-last-of-type(4n-3) 15 === 15 .//p[(count(following-sibling::p) + 4) mod 4 = 0]

p:nth-last-of-type(4n+4) 10 === 10 .//p[count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 4 = 0]

p:nth-last-of-type(4n-4) 10 === 10 .//p[(count(following-sibling::p) + 5) mod 4 = 0]

p:nth-last-of-type(4n+5) 10 === 10 .//p[count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 4 = 0]

p:nth-last-of-type(4n-5) 13 === 13 .//p[(count(following-sibling::p) + 6) mod 4 = 0]

p:nth-last-of-type(5n+0) 9 === 9 .//p[(count(following-sibling::p) + 1) mod 5 = 0]

p:nth-last-of-type(5n-0) 9 === 9 .//p[(count(following-sibling::p) + 1) mod 5 = 0]

p:nth-last-of-type(5n+1) 11 === 11 .//p[(count(following-sibling::p)) mod 5 = 0]

p:nth-last-of-type(5n-1) 10 === 10 .//p[(count(following-sibling::p) + 2) mod 5 = 0]

p:nth-last-of-type(5n+2) 11 === 11 .//p[count(following-sibling::p) >= 1 and (count(following-sibling::p) - 1) mod 5 = 0]

p:nth-last-of-type(5n-2) 11 === 11 .//p[(count(following-sibling::p) + 3) mod 5 = 0]

p:nth-last-of-type(5n+3) 11 === 11 .//p[count(following-sibling::p) >= 2 and (count(following-sibling::p) - 2) mod 5 = 0]

p:nth-last-of-type(5n-3) 11 === 11 .//p[(count(following-sibling::p) + 4) mod 5 = 0]

p:nth-last-of-type(5n+4) 10 === 10 .//p[count(following-sibling::p) >= 3 and (count(following-sibling::p) - 3) mod 5 = 0]

p:nth-last-of-type(5n-4) 11 === 11 .//p[(count(following-sibling::p) + 5) mod 5 = 0]

p:nth-last-of-type(5n+5) 9 === 9 .//p[count(following-sibling::p) >= 4 and (count(following-sibling::p) - 4) mod 5 = 0]

p:nth-last-of-type(5n-5) 9 === 9 .//p[(count(following-sibling::p) + 6) mod 5 = 0]

p:nth-last-of-type(-n+1) 5 === 5 .//p[count(following-sibling::p) <= 0]

p:nth-last-of-type(-n+2) 10 === 10 .//p[count(following-sibling::p) <= 1]

p:nth-last-of-type(-n+3) 15 === 15 .//p[count(following-sibling::p) <= 2]

p:nth-last-of-type(-n+4) 19 === 19 .//p[count(following-sibling::p) <= 3]

p:nth-last-of-type(-n+5) 23 === 23 .//p[count(following-sibling::p) <= 4]

p:nth-last-of-type(-0n+1) 5 === 5 .//p[count(following-sibling::p) < 1]

p:nth-last-of-type(-0n+2) 5 === 5 .//p[count(following-sibling::p) = 1]

p:nth-last-of-type(-0n+3) 5 === 5 .//p[count(following-sibling::p) = 2]

p:nth-last-of-type(-0n+4) 4 === 4 .//p[count(following-sibling::p) = 3]

p:nth-last-of-type(-0n+5) 4 === 4 .//p[count(following-sibling::p) = 4]

p:nth-last-of-type(-1n+1) 5 === 5 .//p[count(following-sibling::p) <= 0]

p:nth-last-of-type(-1n+2) 10 === 10 .//p[count(following-sibling::p) < 2]

p:nth-last-of-type(-1n+3) 15 === 15 .//p[count(following-sibling::p) < 3]

p:nth-last-of-type(-1n+4) 19 === 19 .//p[count(following-sibling::p) < 4]

p:nth-last-of-type(-1n+5) 23 === 23 .//p[count(following-sibling::p) < 5]

p:nth-last-of-type(-2n+1) 5 === 5 .//p[count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 2 = 0]

p:nth-last-of-type(-2n+2) 5 === 5 .//p[count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 2 = 0]

p:nth-last-of-type(-2n+3) 10 === 10 .//p[count(following-sibling::p) < 3 and (count(following-sibling::p) - 2) mod 2 = 0]

p:nth-last-of-type(-2n+4) 9 === 9 .//p[count(following-sibling::p) < 4 and (count(following-sibling::p) - 3) mod 2 = 0]

p:nth-last-of-type(-2n+5) 14 === 14 .//p[count(following-sibling::p) < 5 and (count(following-sibling::p) - 4) mod 2 = 0]

p:nth-last-of-type(-3n+1) 5 === 5 .//p[count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 3 = 0]

p:nth-last-of-type(-3n+2) 5 === 5 .//p[count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 3 = 0]

p:nth-last-of-type(-3n+3) 5 === 5 .//p[count(following-sibling::p) <= 2 and (count(following-sibling::p) - 2) mod 3 = 0]

p:nth-last-of-type(-3n+4) 9 === 9 .//p[count(following-sibling::p) < 4 and (count(following-sibling::p) - 3) mod 3 = 0]

p:nth-last-of-type(-3n+5) 9 === 9 .//p[count(following-sibling::p) < 5 and (count(following-sibling::p) - 4) mod 3 = 0]

p:nth-last-of-type(-4n+1) 5 === 5 .//p[count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 4 = 0]

p:nth-last-of-type(-4n+2) 5 === 5 .//p[count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 4 = 0]

p:nth-last-of-type(-4n+3) 5 === 5 .//p[count(following-sibling::p) <= 2 and (count(following-sibling::p) - 2) mod 4 = 0]

p:nth-last-of-type(-4n+4) 4 === 4 .//p[count(following-sibling::p) <= 3 and (count(following-sibling::p) - 3) mod 4 = 0]

p:nth-last-of-type(-4n+5) 9 === 9 .//p[count(following-sibling::p) < 5 and (count(following-sibling::p) - 4) mod 4 = 0]

p:nth-last-of-type(-5n+1) 5 === 5 .//p[count(following-sibling::p) <= 0 and (count(following-sibling::p)) mod 5 = 0]

p:nth-last-of-type(-5n+2) 5 === 5 .//p[count(following-sibling::p) <= 1 and (count(following-sibling::p) - 1) mod 5 = 0]

p:nth-last-of-type(-5n+3) 5 === 5 .//p[count(following-sibling::p) <= 2 and (count(following-sibling::p) - 2) mod 5 = 0]

p:nth-last-of-type(-5n+4) 4 === 4 .//p[count(following-sibling::p) <= 3 and (count(following-sibling::p) - 3) mod 5 = 0]

p:nth-last-of-type(-5n+5) 4 === 4 .//p[count(following-sibling::p) <= 4 and (count(following-sibling::p) - 4) mod 5 = 0]

nth-of-type.json

Results:

Passed: 125

Passed: 125

p:nth-of-type(1) 5 === 5 .//p[count(preceding-sibling::p) = 0]

p:nth-of-type(2) 5 === 5 .//p[count(preceding-sibling::p) = 1]

p:nth-of-type(3) 5 === 5 .//p[count(preceding-sibling::p) = 2]

p:nth-of-type(4) 4 === 4 .//p[count(preceding-sibling::p) = 3]

p:nth-of-type(5) 4 === 4 .//p[count(preceding-sibling::p) = 4]

p:nth-of-type(n) 52 === 52 .//p

p:nth-of-type(1n) 52 === 52 .//p

p:nth-of-type(2n) 24 === 24 .//p[(count(preceding-sibling::p) + 1) mod 2 = 0]

p:nth-of-type(3n) 17 === 17 .//p[(count(preceding-sibling::p) + 1) mod 3 = 0]

p:nth-of-type(4n) 10 === 10 .//p[(count(preceding-sibling::p) + 1) mod 4 = 0]

p:nth-of-type(5n) 9 === 9 .//p[(count(preceding-sibling::p) + 1) mod 5 = 0]

p:nth-of-type(odd) 28 === 28 .//p[(count(preceding-sibling::p) + 1) mod 2 = 1]

p:nth-of-type(n+0) 52 === 52 .//p

p:nth-of-type(n-0) 52 === 52 .//p

p:nth-of-type(n+1) 52 === 52 .//p

p:nth-of-type(n-1) 52 === 52 .//p

p:nth-of-type(n+2) 47 === 47 .//p[count(preceding-sibling::p) >= 1]

p:nth-of-type(n-2) 52 === 52 .//p

p:nth-of-type(n+3) 42 === 42 .//p[count(preceding-sibling::p) >= 2]

p:nth-of-type(n-3) 52 === 52 .//p

p:nth-of-type(n+4) 37 === 37 .//p[count(preceding-sibling::p) >= 3]

p:nth-of-type(n-4) 52 === 52 .//p

p:nth-of-type(n+5) 33 === 33 .//p[count(preceding-sibling::p) >= 4]

p:nth-of-type(n-5) 52 === 52 .//p

p:nth-of-type(even) 24 === 24 .//p[(count(preceding-sibling::p) + 1) mod 2 = 0]

p:nth-of-type(0n+1) 5 === 5 .//p[count(preceding-sibling::p) = 0]

p:nth-of-type(0n+2) 5 === 5 .//p[count(preceding-sibling::p) = 1]

p:nth-of-type(0n+3) 5 === 5 .//p[count(preceding-sibling::p) = 2]

p:nth-of-type(0n+4) 4 === 4 .//p[count(preceding-sibling::p) = 3]

p:nth-of-type(0n+5) 4 === 4 .//p[count(preceding-sibling::p) = 4]

p:nth-of-type(1n+0) 52 === 52 .//p

p:nth-of-type(1n-0) 52 === 52 .//p

p:nth-of-type(1n+1) 52 === 52 .//p

p:nth-of-type(1n-1) 52 === 52 .//p

p:nth-of-type(1n+2) 47 === 47 .//p[count(preceding-sibling::p) >= 1]

p:nth-of-type(1n-2) 52 === 52 .//p

p:nth-of-type(1n+3) 42 === 42 .//p[count(preceding-sibling::p) >= 2]

p:nth-of-type(1n-3) 52 === 52 .//p

p:nth-of-type(1n+4) 37 === 37 .//p[count(preceding-sibling::p) >= 3]

p:nth-of-type(1n-4) 52 === 52 .//p

p:nth-of-type(1n+5) 33 === 33 .//p[count(preceding-sibling::p) >= 4]

p:nth-of-type(1n-5) 52 === 52 .//p

p:nth-of-type(2n+0) 24 === 24 .//p[(count(preceding-sibling::p) + 1) mod 2 = 0]

p:nth-of-type(2n-0) 24 === 24 .//p[(count(preceding-sibling::p) + 1) mod 2 = 0]

p:nth-of-type(2n+1) 28 === 28 .//p[(count(preceding-sibling::p)) mod 2 = 0]

p:nth-of-type(2n-1) 28 === 28 .//p[(count(preceding-sibling::p) + 2) mod 2 = 0]

p:nth-of-type(2n+2) 24 === 24 .//p[count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 2 = 0]

p:nth-of-type(2n-2) 24 === 24 .//p[(count(preceding-sibling::p) + 3) mod 2 = 0]

p:nth-of-type(2n+3) 23 === 23 .//p[count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 2 = 0]

p:nth-of-type(2n-3) 28 === 28 .//p[(count(preceding-sibling::p) + 4) mod 2 = 0]

p:nth-of-type(2n+4) 19 === 19 .//p[count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 2 = 0]

p:nth-of-type(2n-4) 24 === 24 .//p[(count(preceding-sibling::p) + 5) mod 2 = 0]

p:nth-of-type(2n+5) 18 === 18 .//p[count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 2 = 0]

p:nth-of-type(2n-5) 28 === 28 .//p[(count(preceding-sibling::p) + 6) mod 2 = 0]

p:nth-of-type(3n+0) 17 === 17 .//p[(count(preceding-sibling::p) + 1) mod 3 = 0]

p:nth-of-type(3n-0) 17 === 17 .//p[(count(preceding-sibling::p) + 1) mod 3 = 0]

p:nth-of-type(3n+1) 18 === 18 .//p[(count(preceding-sibling::p)) mod 3 = 0]

p:nth-of-type(3n-1) 17 === 17 .//p[(count(preceding-sibling::p) + 2) mod 3 = 0]

p:nth-of-type(3n+2) 17 === 17 .//p[count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 3 = 0]

p:nth-of-type(3n-2) 18 === 18 .//p[(count(preceding-sibling::p) + 3) mod 3 = 0]

p:nth-of-type(3n+3) 17 === 17 .//p[count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 3 = 0]

p:nth-of-type(3n-3) 17 === 17 .//p[(count(preceding-sibling::p) + 4) mod 3 = 0]

p:nth-of-type(3n+4) 13 === 13 .//p[count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 3 = 0]

p:nth-of-type(3n-4) 17 === 17 .//p[(count(preceding-sibling::p) + 5) mod 3 = 0]

p:nth-of-type(3n+5) 12 === 12 .//p[count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 3 = 0]

p:nth-of-type(3n-5) 18 === 18 .//p[(count(preceding-sibling::p) + 6) mod 3 = 0]

p:nth-of-type(4n+0) 10 === 10 .//p[(count(preceding-sibling::p) + 1) mod 4 = 0]

p:nth-of-type(4n-0) 10 === 10 .//p[(count(preceding-sibling::p) + 1) mod 4 = 0]

p:nth-of-type(4n+1) 15 === 15 .//p[(count(preceding-sibling::p)) mod 4 = 0]

p:nth-of-type(4n-1) 13 === 13 .//p[(count(preceding-sibling::p) + 2) mod 4 = 0]

p:nth-of-type(4n+2) 14 === 14 .//p[count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 4 = 0]

p:nth-of-type(4n-2) 14 === 14 .//p[(count(preceding-sibling::p) + 3) mod 4 = 0]

p:nth-of-type(4n+3) 13 === 13 .//p[count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 4 = 0]

p:nth-of-type(4n-3) 15 === 15 .//p[(count(preceding-sibling::p) + 4) mod 4 = 0]

p:nth-of-type(4n+4) 10 === 10 .//p[count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 4 = 0]

p:nth-of-type(4n-4) 10 === 10 .//p[(count(preceding-sibling::p) + 5) mod 4 = 0]

p:nth-of-type(4n+5) 10 === 10 .//p[count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 4 = 0]

p:nth-of-type(4n-5) 13 === 13 .//p[(count(preceding-sibling::p) + 6) mod 4 = 0]

p:nth-of-type(5n+0) 9 === 9 .//p[(count(preceding-sibling::p) + 1) mod 5 = 0]

p:nth-of-type(5n-0) 9 === 9 .//p[(count(preceding-sibling::p) + 1) mod 5 = 0]

p:nth-of-type(5n+1) 11 === 11 .//p[(count(preceding-sibling::p)) mod 5 = 0]

p:nth-of-type(5n-1) 10 === 10 .//p[(count(preceding-sibling::p) + 2) mod 5 = 0]

p:nth-of-type(5n+2) 11 === 11 .//p[count(preceding-sibling::p) >= 1 and (count(preceding-sibling::p) - 1) mod 5 = 0]

p:nth-of-type(5n-2) 11 === 11 .//p[(count(preceding-sibling::p) + 3) mod 5 = 0]

p:nth-of-type(5n+3) 11 === 11 .//p[count(preceding-sibling::p) >= 2 and (count(preceding-sibling::p) - 2) mod 5 = 0]

p:nth-of-type(5n-3) 11 === 11 .//p[(count(preceding-sibling::p) + 4) mod 5 = 0]

p:nth-of-type(5n+4) 10 === 10 .//p[count(preceding-sibling::p) >= 3 and (count(preceding-sibling::p) - 3) mod 5 = 0]

p:nth-of-type(5n-4) 11 === 11 .//p[(count(preceding-sibling::p) + 5) mod 5 = 0]

p:nth-of-type(5n+5) 9 === 9 .//p[count(preceding-sibling::p) >= 4 and (count(preceding-sibling::p) - 4) mod 5 = 0]

p:nth-of-type(5n-5) 9 === 9 .//p[(count(preceding-sibling::p) + 6) mod 5 = 0]

p:nth-of-type(-n+1) 5 === 5 .//p[count(preceding-sibling::p) <= 0]

p:nth-of-type(-n+2) 10 === 10 .//p[count(preceding-sibling::p) <= 1]

p:nth-of-type(-n+3) 15 === 15 .//p[count(preceding-sibling::p) <= 2]

p:nth-of-type(-n+4) 19 === 19 .//p[count(preceding-sibling::p) <= 3]

p:nth-of-type(-n+5) 23 === 23 .//p[count(preceding-sibling::p) <= 4]

p:nth-of-type(-0n+1) 5 === 5 .//p[count(preceding-sibling::p) = 0]

p:nth-of-type(-0n+2) 5 === 5 .//p[count(preceding-sibling::p) = 1]

p:nth-of-type(-0n+3) 5 === 5 .//p[count(preceding-sibling::p) = 2]

p:nth-of-type(-0n+4) 4 === 4 .//p[count(preceding-sibling::p) = 3]

p:nth-of-type(-0n+5) 4 === 4 .//p[count(preceding-sibling::p) = 4]

p:nth-of-type(-1n+1) 5 === 5 .//p[count(preceding-sibling::p) <= 0]

p:nth-of-type(-1n+2) 10 === 10 .//p[count(preceding-sibling::p) <= 1]

p:nth-of-type(-1n+3) 15 === 15 .//p[count(preceding-sibling::p) <= 2]

p:nth-of-type(-1n+4) 19 === 19 .//p[count(preceding-sibling::p) <= 3]

p:nth-of-type(-1n+5) 23 === 23 .//p[count(preceding-sibling::p) <= 4]

p:nth-of-type(-2n+1) 5 === 5 .//p[count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 2 = 0]

p:nth-of-type(-2n+2) 5 === 5 .//p[count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 2 = 0]

p:nth-of-type(-2n+3) 10 === 10 .//p[count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 2 = 0]

p:nth-of-type(-2n+4) 9 === 9 .//p[count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 2 = 0]

p:nth-of-type(-2n+5) 14 === 14 .//p[count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 2 = 0]

p:nth-of-type(-3n+1) 5 === 5 .//p[count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 3 = 0]

p:nth-of-type(-3n+2) 5 === 5 .//p[count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 3 = 0]

p:nth-of-type(-3n+3) 5 === 5 .//p[count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 3 = 0]

p:nth-of-type(-3n+4) 9 === 9 .//p[count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 3 = 0]

p:nth-of-type(-3n+5) 9 === 9 .//p[count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 3 = 0]

p:nth-of-type(-4n+1) 5 === 5 .//p[count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 4 = 0]

p:nth-of-type(-4n+2) 5 === 5 .//p[count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 4 = 0]

p:nth-of-type(-4n+3) 5 === 5 .//p[count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 4 = 0]

p:nth-of-type(-4n+4) 4 === 4 .//p[count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 4 = 0]

p:nth-of-type(-4n+5) 9 === 9 .//p[count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 4 = 0]

p:nth-of-type(-5n+1) 5 === 5 .//p[count(preceding-sibling::p) <= 0 and (count(preceding-sibling::p)) mod 5 = 0]

p:nth-of-type(-5n+2) 5 === 5 .//p[count(preceding-sibling::p) <= 1 and (count(preceding-sibling::p) - 1) mod 5 = 0]

p:nth-of-type(-5n+3) 5 === 5 .//p[count(preceding-sibling::p) <= 2 and (count(preceding-sibling::p) - 2) mod 5 = 0]

p:nth-of-type(-5n+4) 4 === 4 .//p[count(preceding-sibling::p) <= 3 and (count(preceding-sibling::p) - 3) mod 5 = 0]

p:nth-of-type(-5n+5) 4 === 4 .//p[count(preceding-sibling::p) <= 4 and (count(preceding-sibling::p) - 4) mod 5 = 0]