RE: [xsl] Comparing and re-assigning variables.

Subject: RE: [xsl] Comparing and re-assigning variables.
From: Jarno.Elovirta@xxxxxxxxx
Date: Mon, 24 Feb 2003 16:35:31 +0200
Hi,

> Ok, here's a part of a xsl file i wrote to create a 
> transactions report:
> 
> <!-- Iterate over all txns. -->
> <table border="0">
> <xsl:for-each select="report-root/txns">
>     <xsl:sort select="cpmBI"/>
>     <xsl:sort select="date"/>
>     <xsl:variable name="currCpmBI" select="cpmMemBI"/>
>     
>     <!-- CODE TO BE INSERTED HERE - READ ON -->    
> 
> </xsl:for-each>
> </table>
> 
> What i want is to compare the value of currCpmBI with the 
> previous value in the iteration (which i have not defined in 
> the above code). If they differ I want to add a some extra html.
> My question now boils down to:
> - How can i remember the previous value of cpmMemBI and how 
> would I store it so i can compare it with the current value 
> in the iteration? 
> - If the current value has changed, how can i re-initialise 
> the previous value with the current value?

Would this work for you - I think there's a name for this sort of generate-sorted-id-list-and-process-that-instead-of-two-passes-or-node-set-extension method, but don't remember what? If it's a silly suggestion, I still blame it being Monday.

<xsl:variable name="delim" select="' '" />
<xsl:key name="id" match="txns" use="generate-id()" />

<xsl:template match="/">
  <xsl:variable name="ids">
    <xsl:for-each select="report-root/txns">
      <xsl:sort select="cpmBI"/>
      <xsl:sort select="date"/>
      <xsl:if test="not(position() = 1)">
        <xsl:value-of select="$delim" />
      </xsl:if>
      <xsl:value-of select="generate-id(.)" />
    </xsl:for-each>
  </xsl:variable>
  <table border="0">
    <xsl:call-template name="recurse">
      <xsl:with-param name="ids" select="$ids" />
    </xsl:call-template>
  </table>
</xsl:template>

<xsl:template name="recurse">
  <xsl:param name="ids" />
  <xsl:param name="previous-cpmMemBI" select="cpmMemBI"/>

  <xsl:choose>
    <xsl:when test="contains($ids, $delim)">
      <xsl:variable name="id" select="substring-before($ids, $delim)" />
      <xsl:for-each select="key('id', $id)">
        <tr>
          <xsl:if test="not(cpmMemBI = $previous-cpmMemBI)">
            <xsl:attribute name="class">change</xsl:attribute>
          </xsl:if>
          <td>
            <xsl:value-of select="cpmMemBI" />
          </td>
          <td>
            <xsl:value-of select="cpmBI" />
          </td>
          <td>
            <xsl:value-of select="date" />
          </td>
        </tr>
        <xsl:call-template name="recurse">
          <xsl:with-param name="ids" select="substring-after($ids, $delim)" />
          <xsl:with-param name="previous-cpmMemBI" select="cpmMemBI" />
        </xsl:call-template>
      </xsl:for-each>
    </xsl:when>
    <xsl:otherwise>
      <xsl:for-each select="key('id', $ids)">
        <tr>
          <td>
            <xsl:value-of select="cpmMemBI" />
          </td>
          <td>
            <xsl:value-of select="cpmBI" />
          </td>
          <td>
            <xsl:value-of select="date" />
          </td>
        </tr>
      </xsl:for-each>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Cheers,

Jarno - New Order: Blue Monday

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


Current Thread