xsl-list
[Top] [All Lists]

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

2007-06-19 01:33:29
On 6/19/07, Don Smith <dtsmithisogen(_at_)yahoo(_dot_)com> 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="*[(_at_)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

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