RE: [xsl] XSL: For-Each Efficient or Not?

Subject: RE: [xsl] XSL: For-Each Efficient or Not?
From: "Michael Kay" <michael.h.kay@xxxxxxxxxxxx>
Date: Mon, 1 Jul 2002 20:11:26 +0100
> >
> > >m:apply[child::*[position()=1 and name()='factorof']]
> >
...
> 
> In this case, however, the processor does have to look at 
> every node since 
> each node has to provide the context for the evaluation of the 
> expression(s) in the predicate. I.e. how does it evaluate 
> name()='factorof' 
> without picking up the node whose name it's testing? It would 
> be a pretty 
> smart processor that had already thrown away all the nodes in 
> the wrong 
> position before it did that.

It's not that difficult. Saxon doesn't quite achieve this today but it
will in the next release (I just tested it).

X[position() = 1 and name()='factorof']

can be statically rewritten as

X[1][name()='factorof']

without too much difficulty. All you need to know is that the right-hand
operand of the "and" does not depend on current position (and you need
to be careful not to rewrite X[1 and 2] as X[1][2]).

Once you have done this rewrite, the standard (run-time) optimization
for X[1] is triggered, so you stop evaluating X after you've found the
first node that matches.

Michael Kay


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread