This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: XSL: For-Each Efficient or Not?
- From: "Michael Kay" <michael dot h dot kay at ntlworld dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Mon, 1 Jul 2002 20:11:26 +0100
- Subject: RE: [xsl] XSL: For-Each Efficient or Not?
- Reply-to: xsl-list at lists dot mulberrytech dot com
> >
> > >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