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