xsl-list
[Top] [All Lists]

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

2008-03-26 03:10:46
       <xsl:apply-templates select="following-sibling::h2[
         generate-id(preceding-sibling::h1[1]) =
         generate-id(current()) ]"/>

This works fine. But is it efficient? Or is there a better 
way to do this in XSL 1.0? If there were zillions of those 
headers, would the processor then have to backtrack at each 
h2 in order to find the first h1 in reverse document order 
and do the comparison? Or are implementations required to be 
smarter than that so the user doesn't have to care about 
these details?

No, implementations are not required to be smart. I think that any
respectable implementation(*) is likely to implement the predicate [1] with
a modicum of intelligence, that is, to stop scanning when the first node is
reached. Anything else is going to vary widely from one product to another.

(*) Actually, implementations are not required to be respectable either.

So this code is likely, for each element, to (a) scan forwards to all the
following siblings, and (b) for each following-sibling::h2, to scan
backwards to the most recent h1.


How could I instruct the processor most efficiently to process all
h2 headers but only so long as there is no h1 header 
encountered on the way, the way being the following-sibling axis?

Using XSLT 2.0: <xsl:for-each-group group-starting-with>!

But in XSLT 1.0 it requires sibling recursion, see below

The other day, "sibling recursion" was mentioned on this list.
Does the following qualify as sibling recursion - and is this 
likely to be more efficient for large input?

       <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.

I think this is likely to be more efficient. But with large input, it will
run out of stack space (typically after 500 or so calls) unless the
processor implements tail-call optimization, which not all do.

Michael Kay
http://www.saxonica.com/


--~------------------------------------------------------------------
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>
--~--