xsl-list
[Top] [All Lists]

Re: [xsl] Sibling axis: All of kind A up to first of kind B

2008-03-27 06:11:46
Michael Kay schrieb:
       <xsl:apply-templates mode="toc"
       select="(following-sibling::h1 | following-sibling::h2)
       [ 1 ]"/>
Might be safer to do following-sibling::*[self::h1 or self::h2][1] -
but depends on the processor.
Why might this be safer? Aren't the resulting node-sets the
same and the expressions therefore equivalent? Doesn't the
union operator impose document order?

Well, I've no way of knowing, but it occurred to me that there might
be processors that fail to recognize that the two operands of the
union operator are both sorted node-sets and that the operation can
therefore be done by a fully-streamed merge, stopping as soon as
either node-set delivers a node. Streamed execution of the second
expression requires much less analysis.

A fully-streamed merge, does that mean the processor starts scanning for
nodes and stops on encountering the first one satisfying the predicate
[self::h1 or self::h2] instead of *first* assembling node-sets for both
h1 and h2, *then* merging them into a union and *then* applying the
predicate [1]?

Saxon copes well with it, however: [...]
The expression tree generated by the Saxon optimizer is in effect

first(following-sibling::(h1|h2))

which is roughly what I suggested you should write. This will do a
single scan of the following sibling axis looking for h1 and h2
elements, and return the first one it finds: no merging needed.

Okay, I think this is the (affirmative) answer to my above question.

Thanks a lot,

Michael Ludwig

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--