Converts most CSS 2.1/3 selectors (see exclusions below) to equivalent XPath 1.0 expression.
See test.js for examples.
To take advantage of the different capabilities of XPath some additional pseudo selectors have been implemented:
All text matching pseudo classes normalize whitespace and ignore tags.
E.g. " my <i>string</i> " is treated as "my string".
:text("foo")Case-insensitive matching of element text:text-case("foo")Case-sensitive:text-case:text-contains("foo")Case-insensitive substring matching of element text:text-contains-case("foo")Case-sensitive:text-contains:text-start("foo")Case-insensitive matching of element starting text:text-start-case("foo")Case-sensitive:text-start:text-end("foo")Case-insensitive matching of element ending text:text-end-case("foo")Case-sensitive:text-end
Selectors containing multiple options, any one of which will be matched:
E.g: div :any(ol, ul, dl) > * equates to div ol > *, div ul > *, div dl > *
:commentSelect comment nodes:comment(n)Select comment nodes at child positionn
Note: Can be combined with :text to match based on comment text content. E.g. p > :comment:text("foo")
As :empty but ignoring whitespace.
:firstis aliased to:first-child:lastis aliased to:last-child:childis aliased to:nth-child:containsis aliased to:text-contains
Authored pseudos can serve as aliases to help simplify selector chains:
/*
* If the `pseudos` option is set the CSS expression is
* preprocessed before generating the XPath expression:
*
* :radio
* => input[type="radio"]
*
* :element-1(Hello)
* => element:child(1):contains("Hello")
*/
const cssToXpath = require('csstoxpath');
const xpathExpr = cssToXpath(':radio, :element-1(Hello)', {
pseudos: {
radio: 'input[type="radio"]',
[/element-(\d+)/]: (data, m) => `element:child(${m[1]}):contains("${data}")`,
}
});The following pseudos are partially supported as they require a tag context:
:nth-of-type:first-of-type:last-of-type
The following pseudos are currently unsupported:
:nth-last-child:nth-last-of-type
Dynamic pseudos are excluded as they can only be partially supported by attribute matching:
:checked:disabled:enabled:required:lang
The following cannot be implemented in XPath 1.0:
- States:
:hover,:focus,:active,:visited,:targetetc. - Elements:
::before,::after,::first-letteretc.