Re: [xsl] Alternating row background color - a twist

Subject: Re: [xsl] Alternating row background color - a twist
From: "M. David Peterson" <m.david.x2x2x@xxxxxxxxx>
Date: Tue, 28 Dec 2004 07:31:41 -0700
Hey Hardy,

Why not use the same math logic against the district_id?

Such like:

<xsl:if test="district_id mod 2 = 0">
...do this?
</xs:if>

The following code might make your recursive problem a bit easier to
manage as well using apply-templates instead of for-each to put the
code into seperate templates that can easily be managed and modified
"outside" of the code-base it will subsequently become back together
with in the output:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
  <xsl:template match="/">
    <xsl:apply-templates select="legislators"/>
  </xsl:template>
  <xsl:template match="legislators">
    <table>
      <xsl:apply-templates select="legislator"/>
    </table>
  </xsl:template>
  <xsl:template match="legislator">
    <xsl:variable name="did">
      <xsl:choose>
        <xsl:when test="district_id mod 2 = 0">
          <xsl:text>#fff</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>#ccc</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <tr style="background:{$did}">
      <td>
        <xsl:value-of select="name"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>

Hope this helps!

Cheers!

<M:D/>


On Tue, 28 Dec 2004 09:13:06 -0500, Hardy Merrill
<HMerrill@xxxxxxxxxxxxxxxx> wrote:
> The typical way of alternating the background color of every other row
> in an HTML table is something like this:
> 
> <xsl:for-each select="msxsl:node-set($sorted_legislators)">
>         <tr>
>                 <xsl:if test="position() mod 2 = 0">
>                         <xsl:attribute
> name="bgcolor">#eeeeee</xsl:attribute>
>                 </xsl:if>
> 
> ------------------------------------
> 
> My situation is this - the for-each is based on legislators sorted by
> district - here's a sample (not real) xml to illustrate:
> 
> <legislators>
>     <legislator>
>          <name>Joe</name>
>          <district_id>1</district_id>
>     </legislator>
>     <legislator>
>          <name>Bob</name>
>          <district_id>2</district_id>
>     </legislator>
>     <legislator>
>          <name>Pete</name>
>          <district_id>2</district_id>
>     </legislator>
> </legislators>
> 
> There will be one *or more* legislators for each district.  Instead of
> alternating the background color for every *legislator*, I want to
> alternate the background color for every *district*.  In other words, I
> want Joe in district_id 1 to have white background, but I want both Bob
> and Pete in district_id 2 to have a gray background.  But since I can't
> change the value of a variable (can't increment a counter), I don't know
> what I can base the bgcolor alternation on.
> 
> The xsl:for-each is based on a select of a variable containing all
> legislators sorted by district.
> 
> I know there is probably an easy way to do this, but I don't know it.
> Help!
> 
> Thanks.
> 
> Hardy Merrill
> 
> 


-- 
:: M. David Peterson ::
XML & XML Transformations, C#, .NET, and Functional Languages Specialist

Current Thread