This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Conditional display of subtotal element
- From: "FRIEDLAND, STEPHEN R" <STEPHEN_R_FRIEDLAND at fleet dot com>
- To: xsl-list at lists dot mulberrytech dot com
- Date: Tue, 16 Apr 2002 16:22:25 -0400
- Subject: [xsl] Conditional display of subtotal element
- Reply-to: xsl-list at lists dot mulberrytech dot com
Hi,
I've combined info from an archived thread to generate
subtotals and totals (thanks, Jeni). My problem now is
that there's a requirement for only the first date heading
for a subtotal to be shown. The first report listing is
what I'd like, the second is what I'm currently getting.
Following the report examples are the xml file and the
xsl. I'm looking for suggestions for how to show or not
show the date based on if it's the first one for this
grouping.
Thanks!
-Steve
Expected Version:
======================================================
Report
04/01 LIB1M 40000000
LIBOR 25300
-----------------------------------------------------
total: 40025300
04/02 LIBOR 130
LIB1M 550
EUR1B 390
-----------------------------------------------------
total: 1070
04/03 LIB1M 30
LIBOR 200
-----------------------------------------------------
total: 230
======================================================
Current Version:
======================================================
Report
04/01 LIB1M 40000000
04/01 LIBOR 25300
-----------------------------------------------------
total: 40025300
04/02 LIBOR 130
04/02 LIB1M 550
04/02 EUR1B 390
-----------------------------------------------------
total: 1070
04/03 LIB1M 30
04/03 LIBOR 200
-----------------------------------------------------
total: 230
======================================================
<?xml version="1.0" encoding="UTF-8"?>
<table header="test">
<row>
<TRADE_ID>71701FB</TRADE_ID>
<NTL>25000000</NTL>
<INDEX>LIB1M</INDEX>
<RESET_DATE>04/01</RESET_DATE>
</row>
<row>
<TRADE_ID>71402FB</TRADE_ID>
<NTL>15000000.00</NTL>
<INDEX>LIB1M</INDEX>
<RESET_DATE>04/01</RESET_DATE>
</row>
<row>
<TRADE_ID>71703FB</TRADE_ID>
<NTL>22000.00</NTL>
<INDEX>LIBOR</INDEX>
<RESET_DATE>04/01</RESET_DATE>
</row>
<row>
<TRADE_ID>71704FB</TRADE_ID>
<NTL>3300.00</NTL>
<INDEX>LIBOR</INDEX>
<RESET_DATE>04/01</RESET_DATE>
</row>
<row>
<TRADE_ID>64505US</TRADE_ID>
<NTL>100.00</NTL>
<INDEX>LIBOR</INDEX>
<RESET_DATE>04/02</RESET_DATE>
</row>
<row>
<TRADE_ID>64506US</TRADE_ID>
<NTL>30.00</NTL>
<INDEX>LIBOR</INDEX>
<RESET_DATE>04/02</RESET_DATE>
</row>
<row>
<TRADE_ID>64507US</TRADE_ID>
<NTL>220.00</NTL>
<INDEX>LIB1M</INDEX>
<RESET_DATE>04/02</RESET_DATE>
</row>
<row>
<TRADE_ID>64508US</TRADE_ID>
<NTL>330.00</NTL>
<INDEX>LIB1M</INDEX>
<RESET_DATE>04/02</RESET_DATE>
</row>
<row>
<TRADE_ID>64509US</TRADE_ID>
<NTL>390.00</NTL>
<INDEX>EUR1B</INDEX>
<RESET_DATE>04/02</RESET_DATE>
</row>
<row>
<TRADE_ID>60610US</TRADE_ID>
<NTL>30.00</NTL>
<INDEX>LIB1M</INDEX>
<RESET_DATE>04/03</RESET_DATE>
</row>
<row>
<TRADE_ID>70811FB</TRADE_ID>
<NTL>200.00</NTL>
<INDEX>LIBOR</INDEX>
<RESET_DATE>04/03</RESET_DATE>
</row>
</table>
======================================================
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:strip-space elements="*"/>
<xsl:variable name="newline">
<xsl:text> </xsl:text>
</xsl:variable>
<xsl:variable name="spacer">
<xsl:text disable-output-escaping="yes"> </xsl:text>
</xsl:variable>
<xsl:variable name="colspacer">
<xsl:text disable-output-escaping="yes"> </xsl:text>
</xsl:variable>
<xsl:variable name="colwidth">
<xsl:text>15</xsl:text>
</xsl:variable>
<xsl:variable name="underline">
<xsl:text>-----------------------------------------------------</xsl:text>
</xsl:variable>
<xsl:key name="rows-by-rdate" match="row" use="RESET_DATE"/>
<xsl:key name="rows-by-rdate-and-index" match="row"
use="concat(RESET_DATE,'+',INDEX)"/>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="table">
<xsl:text>Report</xsl:text><xsl:value-of select="$newline"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="row">
<!-- Generate a subtotal row -->
<xsl:if test="following-sibling::row[1]/INDEX != INDEX or
following-sibling::row[1]/RESET_DATE != RESET_DATE or position() = last()">
<!--xsl:choose>
<xsl:when test="a test to decide if date should be
shown"-->
<xsl:call-template name="padValues">
<xsl:with-param name="value" select="RESET_DATE"/>
<xsl:with-param name="length" select="$colwidth"/>
</xsl:call-template>
<!--/xsl:when>
<xsl:otherwise>
<xsl:value-of select="$colspacer"/>
</xsl:otherwise>
</xsl:choose-->
<xsl:value-of select="$spacer"/>
<xsl:call-template name="padValues">
<xsl:with-param name="value" select="INDEX"/>
<xsl:with-param name="length" select="$colwidth"/>
</xsl:call-template>
<xsl:value-of select="$spacer"/>
<xsl:call-template name="padValues">
<xsl:with-param name="value"
select="sum(key('rows-by-rdate-and-index',concat(RESET_DATE,'+',INDEX))/NTL)
"/>
<xsl:with-param name="length" select="$colwidth"/>
</xsl:call-template>
<xsl:value-of select="$newline"/>
</xsl:if>
<!-- Generate a total row -->
<xsl:if test="following-sibling::row[1]/RESET_DATE != RESET_DATE or
position() = last()">
<xsl:value-of select="$underline"/>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$colspacer"/>
<xsl:value-of select="$spacer"/>
<xsl:call-template name="padValues">
<xsl:with-param name="value">total:</xsl:with-param>
<xsl:with-param name="length" select="$colwidth"/>
</xsl:call-template>
<xsl:value-of select="$spacer"/>
<xsl:call-template name="padValues">
<xsl:with-param name="value"
select="sum(key('rows-by-rdate',RESET_DATE)/NTL)"/>
<xsl:with-param name="length" select="$colwidth"/>
</xsl:call-template>
<xsl:value-of select="$newline"/>
<xsl:value-of select="$newline"/>
</xsl:if>
</xsl:template>
<!-- Create fixed length string left padded -->
<xsl:template name="padValues">
<xsl:param name="value"/>
<xsl:param name="length"/>
<xsl:if test="string-length($value) = $length">
<xsl:value-of select="$value"/>
</xsl:if>
<xsl:if test="string-length($value) < $length">
<xsl:text> </xsl:text>
<xsl:call-template name="padValues">
<xsl:with-param name="value" select="$value"/>
<xsl:with-param name="length" select="$length - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
======================================================
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list