W3C home > Mailing lists > Public > www-style@w3.org > April 2005

Re: XPath & CSS, again

From: Werner Donné <werner.donne@re.be>
Date: Sun, 10 Apr 2005 15:29:42 +0200
Message-ID: <42592A46.8060600@re.be>
To: Laurens Holst <lholst@students.cs.uu.nl>
Cc: www-style@w3.org

I disagree. My experience with XSLT says that it is quite
possible to have very good performance with a large style
sheet, having a lot of templates (and hence XPaths to match),
executed on the average web-page, which is rather small.

It is clear that performance suffers when certain contructs
are used. That is, however, a development matter, i.e. the
style sheet writer must take performance into account.

XPath introduces cases where you have to look ahead in the
document to know if the expression applies. CSS2 selectors
are very simple. You can process the document in document
order, without looking back or ahead. This is, of course, very

Note that CSS3 also introduces look ahead cases. The pseudo
classes "nth-last-child", "nth-last-of-type", "last-child",
"only-of-type" and "empty" require the availability of a
complete sibling list. So it can happen that you have to go back
in the document and reapply certain properties. This will
happen more often with XPath of course.

So with XPath as well as with CSS3 selectors it can be necessary
to keep the complete document, or large parts of it, in memory.
This is a problem for large documents. Web-pages are not that
large however.

Matching XPath expressions can be as fast as matching CSS
selectors. In both cases it is possible to generate a finite
automaton, with which you run several "threads". This means
you step through it in parallel and collect the accept states
after each step. The accept states then have to be cascaded,
according to their specificity (not available for XPath).

For XPath this is more difficult, because the generator has
to rewrite the XPath expressions in order to take into account
the structural conditions. This may result in a larger "canonic"
set of XPath expressions. It is also necessary to be able to
apply the results of the accept states to a previous node instead
of the context node. As mentioned above, this is the same for
CSS3 selectors.


Laurens Holst wrote:
> Werner Donné wrote:
>> Pascal,
>> I would welcome XPath in CSS, but then the XPath specification
>> should introduce the notion of specificity, otherwise the cascading
>> mechanism can't work. Look at how XSLT works around that problem
>> to see how valuable cascading is.
> The problem with XPath in selectors is that you cannot determine their 
> outcome in O(1) or a reasonable O(n) case. With the amount of elements 
> documents can have, this could very quickly result in unacceptable 
> browser rendering times.
> Imagine the case where you have just one style rule which has an 
> //div[1]/following-sibling::*//input selector. When for every element in 
> the document tree that rule is evaluated, perhaps you can see why that 
> would be undesireable. Obviously as more style rules like this are 
> added, the case becomes worse.
> The selectors don't apply to the content, it is the other way around, 
> the content finds the selectors which apply.
> That is the reason why there are certain limits on which selectors in 
> CSS are possible, and why XPath doesn’t fit with CSS.
> Similarly an imaginative "div:apply input" selector (where :apply would 
> denote that the properties apply to the div, not the input) would also 
> be undesireable even though there is certainly a good use case for it, 
> because here too for every element in the document tree it would have to 
> be determined whether one of its children is an input element.
> So, as selector XPath is a no-no in any case. For use in properties, it 
> could be used, perhaps. Problem is that if some part of the document 
> dynamically changes, all properties with XPath in them would have to be 
> recalculated.
> ~Grauw

Werner Donné  --  Re BVBA
Engelbeekstraat 8
B-3300 Tienen
tel: (+32) 486 425803	e-mail: werner.donne@re.be
Received on Sunday, 10 April 2005 13:29:53 UTC

This archive was generated by hypermail 2.3.1 : Monday, 2 May 2016 14:27:17 UTC