xsl-list
[Top] [All Lists]

Re: Merging lines of 3 words or less

2005-09-08 03:40:53
On 9/8/05, David Carlisle <davidc(_at_)nag(_dot_)co(_dot_)uk> 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="{(_at_)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