[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] grouping nesting items, including following items


Subject: Re: [xsl] grouping nesting items, including following items
From: Don Smith <dtsmithisogen@xxxxxxxxx>
Date: Tue, 19 Jun 2007 08:48:41 -0700 (PDT)

Andrew,

Thanks. I won't be able to look at this until tonight.

Don
--- Andrew Welch <andrew.j.welch@xxxxxxxxx> wrote:

> On 6/19/07, Don Smith <dtsmithisogen@xxxxxxxxx>
> wrote:
> > I can't quite figure out how to group nested items
> and
> > also pick up items on the following axis for a
> given
> > group. Here's a sample source:
> >
> > <slide title="Introduction" id="x1">
> >  <point id="x2" >
> >   <text>First point</text>
> >   <subpoints id="x3">
> >    <point id="x3a">
> >     <text>First point, subpoint 1</text>
> >    </point>
> >    <point id="x3b">
> >     <text>First point, subpoint 2</text>
> >    </point>
> >    <point id="x3c">
> >     <text>First point, subpoint 3</text>
> >     <subpoints id="x3c1">
> >      <point id="x3c1a" newSlide="true" 
> title="Intro
> > (cont.)">
> >       <text>First point, subpoint 3, sub-subpoint
> 1 on
> > new slide</text>
> >      </point>
> >      <point id="x3c1b">
> >       <text>First point 4, subpoint 3,
> sub-subpoint 2
> > on new slide</text>
> >      </point>
> >     </subpoints>
> >    </point>
> >    <point id="x4d">
> >     <text>First point, subpoint 4 on new
> slide</text>
> >    </point>
> >   </subpoints>
> >  </point>
> >  <point id="x5" >
> >   <text>Second point, on new slide</text>
> >  </point>
> > </slide>
> >
> > Note the attribute "newSlide" on <point
> id="x3c1a">: I
> > need this element, all its descendants (if any),
> and
> > everything that follows, to be in a different
> group
> > than everything that comes before. Ideally, this
> would
> > mean each group is placed in its own document
> using
> > <xsl:result-document>.
> >
> > This is just one example, but "newSlide='true'"
> can
> > occur on any <point> or even any <subpoints>.
> 
> You need the "modified identity transform" - the one
> which walks the
> following-sibling axis:
> 
> <xsl:template match="node()">
> 	<xsl:copy>
> 		<xsl:copy-of select="@*"/>
> 		<xsl:apply-templates select="node()[1]"/>
> 	</xsl:copy>
> 	<xsl:apply-templates
> select="following-sibling::node()[1]"/>
> </xsl:template>
> 
> Then you just need to override it with a template
> containing the
> specific behaviour for elements with @newSlide =
> 'true':
> 
> <xsl:template match="*[@newSlide = 'true']">
> 	<xsl:result-document href="....">
> 	  <xsl:copy-of select="."/>
> 	  <xsl:copy-of select="following-sibling::*"/>
> 	</xsl:result-document>
> </xsl:template>
> 
> Notice how I've used copy-of instead of
> apply-templates here - you can
> only write one result document at once so nested
> @newSlide's  would
> cause an error.  To get around that don;t use
> xsl:result-document use
> a wrapper element, put the whole thing in a variable
> and then process
> that variable.  Post back for an example of that if
> its needed.
> 
> cheers
> andrew
> 
> 



       
____________________________________________________________________________________
Take the Internet to Go: Yahoo!Go puts the Internet in your pocket: mail, news, photos & more. 
http://mobile.yahoo.com/go?refer=1GNXIC


Current Thread