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

Subject: Re: [xsl] grouping nesting items, including following items
From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx>
Date: Tue, 19 Jun 2007 09:33:14 +0100
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 id="x3b">
    <text>First point, subpoint 2</text>
   <point id="x3c">
    <text>First point, subpoint 3</text>
    <subpoints id="x3c1">
     <point id="x3c1a" newSlide="true"  title="Intro
      <text>First point, subpoint 3, sub-subpoint 1 on
new slide</text>
     <point id="x3c1b">
      <text>First point 4, subpoint 3, sub-subpoint 2
on new slide</text>
   <point id="x4d">
    <text>First point, subpoint 4 on new slide</text>
 <point id="x5" >
  <text>Second point, on new slide</text>

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

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-of select="@*"/>
		<xsl:apply-templates select="node()[1]"/>
	<xsl:apply-templates select="following-sibling::node()[1]"/>

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::*"/>

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.


Current Thread