Re: [xsl] Grouping and Key Problem

Subject: Re: [xsl] Grouping and Key Problem
From: Mukul Gandhi <mukulgandhi2003@xxxxxxxxxxx>
Date: Fri, 9 Apr 2004 16:44:18 +0100 (BST)
Hi James,
  I have written the logic specific to your
requirement. Hope its useful.

<?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="1.0"
encoding="UTF-8" indent="yes"/>
<xsl:key name="kDate" match="Table" use="date"/>
<xsl:key name="kCustomer" match="Table"
use="concat(date,'+',CustomerName)"/>

<xsl:template match="/NewDataSet">
  <html>
    <table border="1">
      <xsl:for-each select="Table">
	<xsl:if test="generate-id(.) =
generate-id(key('kDate', date)[1])">
	<tr>
	  <td colspan="4">
	    <xsl:value-of select="date"/>
	  </td>
	</tr>
	<xsl:for-each select="key('kDate', date)">
	   <xsl:if test="generate-id(.) =
generate-id(key('kCustomer',concat(date,'+',CustomerName))[1])">
	     <xsl:if test="position() = 1">
		<tr>
		  <td/>
		  <td>
		   <xsl:value-of select="CustomerName"/>
		  </td>
		  <td>
		    <xsl:value-of select="ServiceName"/>
		  </td>
		  <td>
		    <xsl:value-of select="TimesPerDay"/>
		  </td>
	      </tr>
	 </xsl:if>
								 <xsl:if test="not(position() = 1)">
	   <tr>
	     <td colspan="2"/>
		<td>
		  <xsl:value-of select="ServiceName"/>
		</td>
		<td>
		  <xsl:value-of select="TimesPerDay"/>
		</td>
	   </tr>
	 </xsl:if>
   </xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:for-each>

</table>
</html>
</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

 --- James Hunt <jamesanthonyhunt@xxxxxxxxx> wrote: >
I'm having problems with grouping and the use of
> keys
> can anyone tell me what I'm doing wrong here. I have
> two records of John on the 12/13/2001 They shouldn't
> display separated. How can I make this tranform into
> something like this:
> 
> 12/13/2001
> John
>   Water Plant
>   Mail
> 12/13/2001
> Jimmy
>   Mail
> 
> Right now it is giving this:
> 
> 12/13/2001
> John
>   Water Plant
>   Mail
> John
>   Water Plant
>   Mail
> 12/13/2001
> Jimmy
>   Mail
> 
> XML File
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <NewDataSet>
> 	<Table>
> 		<mymonth>12</mymonth>
> 		<myday>13</myday>
> 		<myyear>2001</myyear>
> 		<CustomerName>John</CustomerName>
> 		<date>12/13/2001</date>
> 		<TimesPerDay>4</TimesPerDay>
> 		<ServiceName>Water Plant</ServiceName>
> 	</Table>
> 	<Table>
> 		<mymonth>12</mymonth>
> 		<myday>13</myday>
> 		<myyear>2001</myyear>
> 		<CustomerName>John</CustomerName>
> 		<date>12/13/2001</date>
> 		<TimesPerDay>5</TimesPerDay>
> 		<ServiceName>Mail</ServiceName>
> 	</Table>
> 	<Table>
> 		<mymonth>12</mymonth>
> 		<myday>13</myday>
> 		<myyear>2001</myyear>
> 		<CustomerName>Jimmy</CustomerName>
> 		<date>12/13/2001</date>
> 		<TimesPerDay>5</TimesPerDay>
> 		<ServiceName>Mail</ServiceName>
> 	</Table>
> 	<Table>
> 		<mymonth>12</mymonth>
> 		<myday>14</myday>
> 		<myyear>2001</myyear>
> 		<CustomerName>Jimmy</CustomerName>
> 		<date>12/14/2001</date>
> 		<TimesPerDay>5</TimesPerDay>
> 		<ServiceName>Mail</ServiceName>
> 	</Table>
> </NewDataSet>
> 
> 
> 
> 
> 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="1.0"
> indent="yes"/>
> 	<xsl:key name="kCustomer" match="Table"
> use="CustomerName"/>
> 	<xsl:key name="kDate" match="Table" use="date"/>
> 
> 	<xsl:template match="NewDataSet">
> 		<head>
> 			<title>Employee's Week Schedule</title>
> 			<link href="../css/reports.css" type="text/css"
> rel="stylesheet" />
> 		</head>	
> 
> 		<table border="0" cellpadding="4"
> style="border-collapse:collapse;" width="100%">
> 			<tr>
> 				<td colspan="1">
> 					<b>Customer Name</b>
> 				</td>
> 				<td colspan="1">
> 					<b>Service Name</b>
> 				</td>	
> 				<td colspan="2">
> 					<b>Times Per Day</b>
> 				</td>							
> 			</tr>					
> 				<xsl:apply-templates select="Table[generate-id()
> =
> generate-id(key('kDate', date))]" mode="row1"/>					
> 
> 		</table >
> 	</xsl:template>	
> 
> 
> 	<xsl:template match="Table" mode="row1">	
> 		<tr>
> 			<td colspan="4">		
> 				<div style="background-color:red"><xsl:value-of
> select="date"/></div>
> 				<xsl:apply-templates
> select="parent::NewDataSet/Table[date =
> current()/date][CustomerName = key('kCustomer',
> CustomerName)/CustomerName]" mode="row2"/>
> 			</td>
> 		</tr>
> 
> 	</xsl:template>
> 
> 	<xsl:template match="Table" mode="row2">
> 		<tr>
> 			<td colspan="4">			
> 				<hr/>
> 				<xsl:value-of select="CustomerName"/>
>   			      <xsl:apply-templates
> select="parent::NewDataSet/Table[date =
> current()/date][CustomerName =
> current()/CustomerName][ServiceName]" mode="row3"/>
> 			</td>			
> 		</tr>
> 	</xsl:template>
> 	
> 	<xsl:template match="Table" mode="row3">
> 		<tr>
> 			<td />
> 			<td colspan="1">			
> 				<xsl:value-of select="ServiceName"/>
> 			</td>
> 			<td colspan="2">			
> 				<xsl:value-of select="TimesPerDay"/>
> 			</td>						
> 		</tr>		
> 	</xsl:template>
> 	
> </xsl:stylesheet>
> 
> 
> =====
> Home: (513) 661 - 8007 
> Cell: (513) 884 - 4868 
> Email: jamesanthonyhunt@xxxxxxxxx
> 
> __________________________________
> Do you Yahoo!?
> Yahoo! Small Business $15K Web Design Giveaway 
> http://promotions.yahoo.com/design_giveaway/
>  

________________________________________________________________________
Yahoo! India Matrimony: Find your partner online. http://yahoo.shaadi.com/india-matrimony/

Current Thread