- From: Robin Berjon <robin@berjon.com>
- Date: Wed, 23 Nov 2011 11:23:42 +0100
- To: Jonas Sicking <jonas@sicking.cc>
- Cc: public-webapps WG <public-webapps@w3.org>
On Nov 23, 2011, at 01:08 , Jonas Sicking wrote:
> I really don't think that selectors can ever compete with the
> expressiveness of XPath. Consider the following expression:
>
> //div[count(.//span) > 6][count(.//span[@data-foo = ../@data-bar]) mod 2 = 1]
>
> This expression finds all <div> elements which has at least 6 <span>
> descendants and where an odd number of those <span> elements have a
> "data-foo" attribute equal to its parents "data-bar" attribute. It is
> obviously trivial to add arbitrary additional complexity to this
> expression.
>
> Trying to do the same thing in Selectors will just result in a
> incomprehensible mess.
That's exactly what worries me with this plan.
> At the same time, XPath can't ever compete in expressiveness to
> Javascript. Finding all <div> elements with a "data-foo" attribute
> that contains a prime number is not possible in XPath but trivial in
> javascript.
Well, for values of trivial that could be quite slow :) But yes.
> I'm not convinced that it's worth investing in XPath. At least not
> beyond the low-hanging fruit of making most of the arguments to
> .evaluate optional. But I think trying to make selectors compete in
> expressiveness with XPath is a loosing battle.
I don't think that anyone has requested much beyond making the existing API actually usable (either by fixing it directly or by adding a new, simple one). That's all that's needed IMHO and it doesn't strike me as much.
I would be thinking about something along the lines of (untested, off the top of my head):
Node.prototype.queryXPath = function (xpath, ns) {
ns = ns || {};
var snap = this.ownerDocument
.evaluate(xpath,
this,
function (p) { return ns[p] || null; },
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null);
var ret = [];
for (var i = 0; i < snap.snapshotLength; i++) ret.push(snap.snapshotItem(i));
return ret;
};
or, if people prefer, even just:
Node.prototype.queryXPath = function (xpath) {
var snap = this.ownerDocument
.evaluate(xpath,
this,
function () { return "http://www.w3.org/1999/xhtml"; },
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null);
var ret = [];
for (var i = 0; i < snap.snapshotLength; i++) ret.push(snap.snapshotItem(i));
return ret;
};
Which hardly strikes me as a terribly complex addition.
--
Robin Berjon - http://berjon.com/ - @robinberjon
Received on Wednesday, 23 November 2011 10:24:27 UTC