RE: [xsl] grouping like items into one

Subject: RE: [xsl] grouping like items into one
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 23 Jan 2009 10:13:11 -0000
 <xsl:template match="DD">
   <DD>
     <xsl:for-each-group select="text" group-adjacent="@border">
        <xsl:choose>
           <xsl:when test="current-grouping-key()='single'">
              <span class="border">
                 <xsl:apply-templates select="current-group()"/>
              </
           </
           <xsl:otherwise>
              <xsl:apply-templates select="current-group()"/>
           </
        </
     </
   </
 </

 <xsl:template match="text[@italic='true']">
   <i><xsl:value-of select="."/></i>
 </

 <xsl:template match="text[@italic='false']">
   <xsl:value-of select="."/>
 </

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


> -----Original Message-----
> From: Fred Christian [mailto:fredc@xxxxxxxxxx] 
> Sent: 23 January 2009 01:37
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] grouping like items into one
> 
> I know I have done this with xsl 1.0 before and could figure 
> it out, but 1.0 is painful :) So I am trying to figure it out 
> with 2.0 and am getting stuck. I am running into that "how do 
> I know what to look up if I don't know how to spell it" jam.
> I looked at the xsl:for-each-group element, but I don't think 
> that will work in this situation.
> Someone want to take a whack at it?
> 
> 
> I want to group bordered text into one border <span>, but 
> leave italic text ( and other styles ) in individual nodes.
> 
> _______Source XML__________________
> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DD> 
> <text italic="false" border="">a </text> <text italic="false" 
> border="single">b </text> <text italic="true" 
> border="single">c </text> <text italic="true" border="">d 
> </text> <text italic="false" border="">e </text> <text 
> italic="false" border="single">f </text> <text italic="false" 
> border="single">g </text> <text italic="false" border="">h 
> </text> <text italic="true" border="single">i </text> <text 
> italic="true" border="">j </text> </DD>
> 
> _____Current output (formated for 
> readability)________________ a <span class="border">b </span> 
> <span class="border"><i>c </i></span> <i>d </i> e <span 
> class="border">f </span> <span class="border">g </span> h 
> <span class="border"><i>i </i></span> <i>j </i>
> 
> 
> ____ Desired output (formated for readability) ______________
> ____ Note how there is one <span....> around b <i>c </> and   
> around "f 
> g " ___
> a
> <span class="border">b <i>c </i></span>
> <i>d </i>
> e
> <span class="border">f g </span>
> h
> <span class="border"></span>
> <i>i </i>
> <i>j </i>
> 
> _____________ current xsl  _______________
> <xsl:stylesheet version="2.0"   
>     xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>     xmlns:xs="http://www.w3.org/2001/XMLSchema";
>     xmlns:saxon="http://saxon.sf.net/";
>     exclude-result-prefixes="xs saxon">
> 
> <xsl:template match="/DD">
>     <xsl:apply-templates/>
> </xsl:template>
> 
> <xsl:template match="text">
>     <xsl:choose>
>         <xsl:when test="@border='single'">
>          <span class="border"><xsl:apply-templates select="." 
> mode="moreStyles"/></span>
>         </xsl:when>
>         <xsl:otherwise><xsl:apply-templates select="." 
> mode="moreStyles"/></xsl:otherwise>
>     </xsl:choose>
> </xsl:template>
> 
> <xsl:template match="text" mode="moreStyles">
>     <xsl:choose>
>         <xsl:when test="./@italic='true'">
>          <i><xsl:apply-templates/></i>
>         </xsl:when>
>         <xsl:otherwise><xsl:apply-templates/></xsl:otherwise>
>     </xsl:choose>
> </xsl:template>
> 
> </xsl:stylesheet>

Current Thread