[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

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

Subject: RE: Sibling axis: All of kind A up to first of kind B
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 26 Mar 2008 10:10:08 -0000
RE:  Sibling axis: All of kind A up to first of kind B
>        <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/

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Cast Your Vote

We need your help – Vote for DataDirect XML Products!

  • Best SOA or XML site

Winners and finalists announced at SOA World Conference in November.

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2007 All Rights Reserved.