Re: a new(?) grouping problem

Subject: Re: a new(?) grouping problem
From: "Nikolai Grigoriev" <grig@xxxxxxxxxxx>
Date: Thu, 29 Jun 2000 17:22:17 +0400
Mike Brown wrote:

> I want to group consecutive days with the same hours together, and just
> print the first and last day in each group.
>
> I also want to ignore the 'Holidays' day. I put it in there because I
> can't use a solution that assumes Sunday's hours aren't followed by
> something that could be the same.

This can be achieved by recursion: you call a template recursively until there's
no more following-siblings that have the same text (passed as a param), like in
the stylesheet below:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">

<xsl:output method="html" version="4.0"/>

<!-- Root template: just create a table. -->
<xsl:template match="Hours">
  <table><xsl:apply-templates/></table>
</xsl:template>

<!-- Exclude holidays from processing -->
<xsl:template match="Holidays" priority="2"/>

<!-- Single days, except for holidays. -->
<!-- A modeless template creates the row -->
<xsl:template match="Hours/*">
  <xsl:variable name="hours" select="text()"/>

  <xsl:if
      test="not(preceding-sibling::*[not(self::Holidays)][1][text()=$hours])">
    <tr>
      <td>
        <xsl:value-of select="name()"/>
        <xsl:apply-templates mode="end"
              select="following-sibling::*[not(self::Holidays)][1]">
          <xsl:with-param name="hours" select="$hours"/>
        </xsl:apply-templates>
      </td>
      <td><xsl:value-of select="."/></td>
    </tr>
  </xsl:if>
</xsl:template>

<!-- A day closes the period if there's no better candidate -->
<xsl:template match="Hours/*" mode="end">
  <xsl:param name="hours"/>

  <xsl:if test="text()=$hours">
    <xsl:choose>
      <xsl:when
          test="following-sibling::*[not(self::Holidays)][1][text()=$hours]">
        <xsl:apply-templates mode="end"
              select="following-sibling::*[not(self::Holidays)][1]">
          <xsl:with-param name="hours" select="$hours"/>
        </xsl:apply-templates>
      </xsl:when>
      <xsl:otherwise>
        <xsl:text> - </xsl:text><xsl:value-of select="name()"/>
      </xsl:otherwise>
    </xsl:choose>

  </xsl:if>
</xsl:template>

</xsl:stylesheet>




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread