npm install csstoxpathConverts 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:
#### :text
All text matching pseudo classes normalize whitespace and ignore tags.
E.g. " my string " 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
* :comment Select comment nodes
* :comment(n) Select comment nodes at child position n
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.
* :first is aliased to :first-child
* :last is aliased to :last-child
* :child is aliased to :nth-child
* :contains is aliased to :text-contains
Authored pseudos can serve as aliases to help simplify selector chains:
``jspseudos
/*
* If the option is set the CSS expression iselement:child(${m[1]}):contains("${data}")
* 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) => ,`
}
});
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, :target etc.::before
* Elements: , ::after, ::first-letter` etc.