Re: XPath and Selectors are identical, and shouldn't be co-developed

On Tue, Nov 29, 2011 at 4:16 PM, João Eiras <joaoe@opera.com> wrote:
> On Tue, 29 Nov 2011 20:42:59 -0000, Tab Atkins Jr. <jackalmage@gmail.com>
> wrote:
>> My stated goal was to argue that working on XPath is a bad idea
>
> You can argue that it's wasted effort or duplicated by CSS Selectors
> (although XPath is already specified, implemented and deployed unlike the
> new Selector features), but it goes a long way for you to claim it is a
> *bad* idea.
>
> I still think you are underestimating XPath. There are things possible in
> XPath today that will never be possible with Selectors in the unforeseeable
> future, like a parent selector, or doing a case insensitive substring match
> of a node's text content (from any descendant).

Incorrect.  The Selectors 4 editor's draft contains the same
functionality as a parent selector:  "A/parent::B" in XPath is the
same as "B! > A" in Selectors.  I talked about this in my email.
Matching based on text contents has been proposed multiple times, but
has always been shot down due to performance concerns for CSS.  A
profile of Selectors designed for JS (querySelector or find) wouldn't
have that same worry.


> If you're suggesting forking Selectors into the ones used in stylesheet, and
> the others used in the Selector API, then it is repeated effort and a *bad*
> idea because those use cases are already covered today with already deployed
> XPath and its DOM 3 XPath API, which is convoluted and hard to use, which is
> what people are trying to make friendlier. And it would definitely confuse
> everyone, because then developers would need to know which features they can
> use in stylesheets and which they cannot.

You are looking at the cost of one possibility, and ignoring the
other.  If we go your way, developers have a single set of Selectors
which they can use in CSS and JS, plus a set of XPath they can use in
JS, but they can't combine the two JS solutions in any reasonable way,
so the features that each have can't be used together, and for the
parts that are duplicated between the two they have to learn two
different syntaxes.  I think it's impossible to argue that that's not
at least as confusing; I will argue further and say that it's
substantially more confusing.

This argument in general seems to have an underlying assumption that
XPath is necessarily more powerful than Selectors.  This is incorrect.
 Most of the useful bits of XPath and Selectors are isomorphic.  XPath
has a few things that are more powerful, such as a general mechanism
for matching nodes based on simple math or string manipulation, but
they can be duplicated quite easily in JS.  Selectors has a few things
that are more powerful, such as most of the pseudoclasses, but these
are *not* generally easily duplicable in JS.  For example, handling
something "simple" like :nth-col() requires snooping through the
entire preceding table structure for row/colspan cells that would
alter the numbering beyond simple sibling-counting.

So, the simple hack of doing
"document.evaluate(...).filter(function(elem){...})" doesn't work so
well if you're patching XPath into the union of features, but it
*does* work pretty well for patching Selectors into the union of
features.

My overriding point is that the mental cost of supporting two nearly
identical languages merely because they both already exist and each
has slightly different functionality than the other is horrible, and
we should avoid it if at all possible.  It is roughly equivalent to
having, say, a <captionedvideo> element that accepts subtitles but
doesn't have controls, and a <usablevideo> that has controls but not
subtitles.  Even if you can achieve any given feature by choosing one
or the other, it's much less useful (and much more confusing) to have
the two separate than it would be to just combine them.  It is
absolutely worthwhile to expend effort in raising up one language to
the union or near-union of the feature-set (or achieve the union some
other way, like cheap/easy JS integration with Selectors) than to
attempt to pursue both simultaneously.

~TJ

Received on Wednesday, 30 November 2011 00:53:28 UTC