Hi,
I am using xslt 1.0 and msxml
I am struggling to get my xslt to group correctly to create the total cost and total number of insertions and I would appreciate if someone could help me.
This is the ouput I need:
Media - Pub Type - Ad Unit - # Insertions - Total Cost
Blood 2 6562.00
Blood Cover 4 1 3614.62
Blood Cover 2 1 3253.16AMR Cover 2 1 11806.50
The insertion totals and total cost should be grouped by Position/@name
To get the total insertions I need to use the <Insertion /> nodes and to get the total cost I need to use the <RateCardRate value="2409.75" /> nodes
However, in my xslt I was only able to get the total insertion and cost for the Vehicle nodes. I was not able to group it by Position/@name.
This is the xml
<Schedule projectId="2354">
<Media detail="1">
<Vehicle key="BLOOD" AgencyDiscount="15" CashDiscount="0" insCount="1">
<RateCards>
<RateCard id="7962" name="2011p" detail="1">
<EarnedBW value="1" />
<EarnedColour value="1" />
<Ads>
<Ad key="545:5922" manufac="">
<RateCardRate value="2409.75" />
<ManualRate value="" AdjustedValue="" />
<Position id="0" name="" />
<Issues>
<Issue date="2010-05-06">
<Insertion />
</Issue>
<Issue date="2010-05-13">
<Insertion />
</Issue>
</Issues>
</Ad>
<Ad key="545:5922" manufac="">
<RateCardRate value="3614.62" />
<ManualRate value="" AdjustedValue="" />
<Position id="531" name="Cover 4" />
<Issues>
<Issue date="2010-05-06">
<Insertion />
</Issue>
<Issue date="2010-05-13">
<Insertion />
</Issue>
</Issues>
</Ad>
<Ad key="545:5922" manufac="">
<RateCardRate value="3253.16" />
<ManualRate value="" AdjustedValue="" />
<Position id="534" name="Cover 2" />
<Issues>
<Issue date="2010-05-06">
<Insertion />
</Issue>
<Issue date="2010-05-13">
<Insertion />
</Issue>
</Issues>
</Ad>
<Ad key="300:5922" manufac="">
<RateCardRate value="4152.25" />
<ManualRate value="" AdjustedValue="" />
<Position id="0" name="" />
<Issues>
<Issue date="2010-05-06">
<Insertion />
</Issue>
<Issue date="2010-05-13">
<Insertion />
</Issue>
</Issues>
</Ad>
</Ads>
</RateCard>
</RateCards>
</Vehicle>
<Vehicle key="AMR" insCount="1" AgencyDiscount="15" CashDiscount="0">
<RateCards>
<RateCard id="7897" name="2011p">
<EarnedBW value="1" />
<EarnedColour value="1" />
<Ads>
<Ad key="300:5922" manufac="">
<RateCardRate value="11806.50" />
<ManualRate value="" AdjustedValue="" />
<Position id="0" name="Cover 2" />
<Issues>
<Issue date="2010-06-01">
<Insertion />
</Issue>
<Issue date="2010-07-01">
<Insertion />
<Insertion />
</Issue>
</Issues>
</Ad>
</Ads>
</RateCard>
</RateCards>
</Vehicle>
</Media>
</Schedule>
My xslt
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="
http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title>Schedule</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="Vehicle">
<table border="2">
<tr>
<th>Media</th>
<th>Pub Type</th>
<th>Ad Unit</th>
<th>#Ins</th>
<th>Cost</th>
</tr>
<xsl:apply-templates select="RateCards/RateCard/Ads/Ad/Position">
<xsl:with-param name ="media" select ="@key"/>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match ="text()">
</xsl:template>
<xsl:template match="Position">
<xsl:param name ="media"/>
<tr>
<td>
<xsl:value-of select="$media"/>
</td>
<td>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="@name"/>
</td>
<td align="right">
<xsl:value-of select="count(../../Ad)"/>
</td>
<td align="right">
<xsl:call-template name="AdTotal">
<xsl:with-param name="AdItems"
select="../../Ad"/>
</xsl:call-template>
</td>
</tr>
</xsl:template>
<xsl:template name="AdTotal">
<xsl:param name="AdItems"/>
<xsl:choose>
<xsl:when test="$AdItems">
<xsl:variable
name="FirstInList"
select="$AdItems[1]"/>
<xsl:variable name="TotalOfRest">
<xsl:call-template name="AdTotal">
<xsl:with-param
name="AdItems"
select="$AdItems[position()!=1]"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of
select="format-number($FirstInList/RateCardRate/@value + $TotalOfRest,'#.00')"/>
</xsl:when>
<xsl:otherwise>
0
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
This is the wrong HTML table produced:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Schedule</title>
</head>
<body>
<table border="2">
<tr>
<th>Media</th>
<th>Pub Type</th>
<th>Ad Unit</th>
<th>#Ins</th>
<th>Cost</th>
</tr>
<tr>
<td>BLOOD</td>
<td>
</td>
<td>
</td>
<td align="right">4</td>
<td align="right">13429.78</td>
</tr>
<tr>
<td>BLOOD</td>
<td>Cover 4</td>
<td>Cover 4</td>
<td align="right">4</td>
<td align="right">13429.78</td>
</tr>
<tr>
<td>BLOOD</td>
<td>Cover 2</td>
<td>Cover 2</td>
<td align="right">4</td>
<td align="right">13429.78</td>
</tr>
<tr>
<td>BLOOD</td>
<td>
</td>
<td>
</td>
<td align="right">4</td>
<td align="right">13429.78</td>
</tr>
</table>
<table border="2">
<tr>
<th>Media</th>
<th>Pub Type</th>
<th>Ad Unit</th>
<th>#Ins</th>
<th>Cost</th>
</tr>
<tr>
<td>AMER_FAMILY_PHYSICIAN</td>
<td>
</td>
<td>
</td>
<td align="right">1</td>
<td align="right">11806.50</td>
</tr>
</table>
</body>
</html>