csstoxpath v2.0.0
CSS to XPath
Converts most CSS 2.1/3 selectors (see exclusions below) to equivalent XPath 1.0 expression.
See test.js for examples.
Extension pseudos
To take advantage of the different capabilities of XPath some additional pseudo selectors have been implemented:
:text
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
:any
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 > *
:comment
: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")
:childless
As :empty but ignoring whitespace.
Aliased pseudos
:firstis aliased to:first-child:lastis aliased to:last-child:childis aliased to:nth-child:containsis aliased to:text-contains
Author pseudos
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}")`,
}
});Limitations
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.