xsl-list
[Top] [All Lists]

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

2007-06-19 08:48:57
Andrew,

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

Don
--- Andrew Welch <andrew(_dot_)j(_dot_)welch(_at_)gmail(_dot_)com> wrote:

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





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

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

<Prev in Thread] Current Thread [Next in Thread>