RE: [xsl] Merging lines of 3 words or less

Subject: RE: [xsl] Merging lines of 3 words or less
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Thu, 8 Sep 2005 17:34:51 +0100
You can read this as a special case of the following:

<xsl:for-each-group select="line" group-starting-with="line[XXX]">
  do group-heading
  <xsl:for-each select="current-group()">
    process a line
  </xsl:for-each>
  do group-footing
</xsl:for-each-group>

Which means: process all the lines; before the first line and whenever you
encounter one that satisfies XXX, produce a group heading; at the end of a
group, produce a group footing. The value of current-group() is the set of
lines making up the group you are processing at the time.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: James Cummings [mailto:cummings.james@xxxxxxxxx] 
> Sent: 08 September 2005 11:41
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Merging lines of 3 words or less
> 
> On 9/8/05, David Carlisle <davidc@xxxxxxxxx> wrote:
> > 
> > Your code looked OK, but I think it's easier with for-each group,
> > basically you want to group adjacent lines together, 
> starting each group
> > with a long line, you can express that directly:
> > 
> > 
> > <xsl:stylesheet 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="2.0">
> >      <xsl:template match="/"><xsl:apply-templates/></xsl:template>
> >      <xsl:template match="node()|@*" priority="-1">
> >          <xsl:copy><xsl:apply-templates 
> select="node()|@*"/></xsl:copy>
> >      </xsl:template>
> >      <xsl:template match="lg">
> >          <lg n="{@n}">
> >          <xsl:for-each-group select="l" 
> group-starting-with="l[w[4]]">
> >                   <l n="{position()}">
> >                   <xsl:for-each select="current-group()">
> >                   <xsl:copy-of select="(node(),' ')"/>
> >                   </xsl:for-each>
> >                  </l>
> >          </xsl:for-each-group>
> >              </lg>
> >      </xsl:template>
> 
> See that is a lot shorter and seems to even make sense.  I tend to
> still approach things in an XSLT1.0 sort of way.  I'm always a bit
> confused by xsl:for-each group.  Here it is selecting lines and then
> is saying that it starts with lines which have more than 4 words? 
> Then inside the recreated line for each of the current group (which is
> what at this point?) it copies any node() under that?
> 
> Well, at least my first attempt did work, even if it wasn't nearly so
> elegant. :-(
> 
> -James
> 
> -- 
> James Cummings, Cummings dot James at GMail dot com

Current Thread