[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Grouping problem - Duplicates


Subject: Re: [xsl] Grouping problem - Duplicates
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Fri, 30 Apr 2004 10:48:45 -0700 (PDT)

Hi Sarah,
  I rewrote the XSL. I have not used HTML tags in my
stylesheet. Hope you can adapt it for yourself.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan"
exclude-result-prefixes="xalan">
<xsl:output method="text" version="1.0"
encoding="UTF-8" indent="yes"/>

<xsl:key name="by-area1"
match="/Company/Suppliers/Area/*" use="name()"/>
<xsl:key name="by-area2" match="area" use="@name"/>
<xsl:key name="by-name" match="Name"
use="concat(FirstName,':',LastName)"/>

<xsl:template match="/Company/Suppliers">
  <xsl:variable name="rtf1">
    <xsl:for-each select="Area/*">
      <xsl:if test="generate-id(.) =
generate-id(key('by-area1', name())[1])">
	<xsl:for-each select="key('by-area1', name())">
	  <area name="{name()}">
	    <xsl:value-of select="."/>
	  </area>
	</xsl:for-each>
      </xsl:if>
    </xsl:for-each>
  </xsl:variable>
  
  <xsl:variable name="rtf3">
    <xsl:for-each select="SalesPeople/SalesPerson">
      <xsl:variable name="rtf2">
	<Name>
	  <LastName>
	     <xsl:value-of select="Name/LastName"/>
	  </LastName>
	  <FirstName>
	     <xsl:value-of select="Name/FirstName"/>	 
</FirstName>
	</Name>
      </xsl:variable>
      
      <xsl:for-each select="Supplier">
	<xsl:variable name="supplier" select="."/>
	  <xsl:for-each select="xalan:nodeset($rtf1)/area">
	    <xsl:if test="text() = $supplier">
  	      <area name="{@name}">
		<Name>
		  <LastName>
		    <xsl:value-of
select="xalan:nodeset($rtf2)/Name/LastName"/>
		  </LastName>
		  <FirstName>
		    <xsl:value-of
select="xalan:nodeset($rtf2)/Name/FirstName"/>
		  </FirstName>
		</Name>
	      </area>
	    </xsl:if>
         </xsl:for-each>
       </xsl:for-each>
     </xsl:for-each>
   </xsl:variable>
   
   <xsl:variable name="rtf4">
     <xsl:for-each select="xalan:nodeset($rtf3)/area">
	<xsl:if test="generate-id(.) =
generate-id(key('by-area2', @name)[1])">
	   <area name="{@name}">
	      <xsl:for-each select="key('by-area2', @name)">	
				      <Name>
		 <LastName>
		   <xsl:value-of select="Name/LastName"/>
		 </LastName>
		 <FirstName>
		   <xsl:value-of select="Name/FirstName"/>
		  </FirstName>
	      </Name>
	     </xsl:for-each>
	</area>
      </xsl:if>
    </xsl:for-each>
  </xsl:variable>
  
  <xsl:for-each select="xalan:nodeset($rtf4)/area">
     <xsl:sort select="@name"/>
	<xsl:value-of select="@name"/><xsl:text>
	</xsl:text>
	<xsl:variable name="rtf5">
	   <xsl:copy-of select="."/>
	</xsl:variable>
	<xsl:for-each
select="xalan:nodeset($rtf5)/area/Name">
	   <xsl:if test="generate-id(.) =
generate-id(key('by-name',
concat(FirstName,':',LastName))[1])">
	      <xsl:value-of select="FirstName"/><xsl:text> 
</xsl:text>
		<xsl:value-of select="LastName"/><xsl:text>
		</xsl:text>
	    </xsl:if>
	</xsl:for-each>
     </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

--- Sarah <sarah10@xxxxxxxxxxx> wrote:

> Here is a copy of my XML file called Company.xml:
> 
> <Company>
>          <Suppliers>
>                  <Area>
>                          <North>Supp 1 Nor</North>
>                          <South>Supp 1 Sou</South>
>                          <Center>Supp 1
> Cntr</Center>
>                          <North>Supp 2 Nor</North>
>                          <North>Supp 3 Nor</North>
>                          <South>Supp 2 Sou</South>
>                          <South>Supp 3 Sou</South>
>                          <Center>Supp 2
> Cntr</Center>
>                          <Center>Supp 3
> Cntr</Center>
>                          <North>Smith Suppliers
> LTD.</North>
>                          <South>Smith Suppliers
> LTD.</South>
>                          <Center>Sundance suppliers
> Cntr</Center>
>                  </Area>
>                  <SalesPeople>
>                          <SalesPerson>
>                                  <Name>
>                                         
> <LastName>lName Supp 1</LastName>
>                                         
> <FirstName>John</FirstName>
>                                  </Name>
>                                 
> <Title>Manager</Title>
>                                  <Supplier>Supp 1
> Nor</Supplier>
>                                  <Supplier>Supp 1
> Sou</Supplier>
>                                  <Supplier>Supp 1
> Cntr</Supplier>
>                                  <Supplier>Supp 2
> Cntr</Supplier>
>                                  <Supplier>Supp 3
> Cntr</Supplier>
>                                  <Supplier>Smith
> Suppliers LTD.</Supplier>
>                                  <Supplier>Smith
> Suppliers LTD.</Supplier>
>                                  <Supplier>Sundance
> suppliers Cntr</Supplier>
>                          </SalesPerson>
>                          <SalesPerson>
>                                  <Name>
>                                         
> <LastName>lName Supp 2</LastName>
>                                         
> <FirstName>Kathy</FirstName>
>                                  </Name>
>                                  <Title>CEO</Title>
>                                  <Supplier>Supp 2
> Nor</Supplier>
>                                  <Supplier>Supp 2
> Sou</Supplier>
>                                  <Supplier>Supp 2
> Cntr</Supplier>
>                                  <Supplier>Supp 1
> Cntr</Supplier>
>                                  <Supplier>Supp 2
> Cntr</Supplier>
>                                  <Supplier>Supp 3
> Cntr</Supplier>
>                                  <Supplier>Smith
> Suppliers LTD.</Supplier>
>                          </SalesPerson>
>                          <SalesPerson>
>                                  <Name>
>                                         
> <LastName>lName Supp 3</LastName>
>                                         
> <FirstName>Dan</FirstName>
>                                  </Name>
>                                  <Title>Dr.</Title>
>                                  <Supplier>Supp 3
> Nor</Supplier>
>                                  <Supplier>Supp 3
> Sou</Supplier>
>                                  <Supplier>Supp 3
> Cntr</Supplier>
>                                  <Supplier>Supp 1
> Cntr</Supplier>
>                                  <Supplier>Supp 2
> Cntr</Supplier>
>                                  <Supplier>Supp 3
> Cntr</Supplier>
>                                  <Supplier>Smith
> Suppliers LTD.</Supplier>
>                                  <Supplier>Smith
> Suppliers LTD.</Supplier>
>                                  <Supplier>Sundance
> suppliers Cntr</Supplier>
>                          </SalesPerson>
>                          <SalesPerson>
>                                  <Name>
>                                         
> <LastName>lName Apprentice</LastName>
>                                         
> <FirstName>George</FirstName>
>                                  </Name>
>                                 
> <Title>Apprentice</Title>
>                                  <Supplier>Supp 3
> Nor</Supplier>
>                          </SalesPerson>
>                          <SalesPerson>
>                                  <Name>
>                                         
> <LastName>lName Samuel</LastName>
>                                         
> <FirstName>Dave</FirstName>
>                                  </Name>
>                                 
> <Title>Developer</Title>
>                                  <Supplier>Supp 3
> Nor</Supplier>
>                                  <Supplier>Supp 3
> Sou</Supplier>
>                                  <Supplier>Supp 3
> Cntr</Supplier>
>                                  <Supplier>Supp 1
> Cntr</Supplier>
>                                  <Supplier>Supp 2
> Cntr</Supplier>
>                          </SalesPerson>
>                  </SalesPeople>
>          </Suppliers>
> </Company>
> 
> 
> I would like to see the following output:
> 
> 
> 
> 
> Sales People by Areas
> 
> 
> Center
> 
> Dave lName Samuel
> John lName Supp 1
> Kathy lName Supp 2
> Dan lName Supp 3
> 
> North
> 
> John lName Supp 1
> Kathy lName Supp 2
> George lName Apprentice
> Dave lName Samuel
> Dan lName Supp 3
> 
> South
> 
> John lName Supp 1
> Kathy lName Supp 2
> Dave lName Samuel
> Dan lName Supp 3
> 
> 
> But I get:
> 
> 
> Sales People by Areas
> 
> 
> Center
> 
> Dave lName Samuel
> John lName Supp 1
> Kathy lName Supp 2
> Dan lName Supp 3
> Dave lName Samuel
> John lName Supp 1
> Kathy lName Supp 2
> Dan lName Supp 3
> Dave lName Samuel
> John lName Supp 1
> Kathy lName Supp 2
> Dan lName Supp 3
> John lName Supp 1
> Dan lName Supp 3
> 
> North
> 
> John lName Supp 1
> Kathy lName Supp 2
> George lName Apprentice
> Dave lName Samuel
> Dan lName Supp 3
> John lName Supp 1
> Kathy lName Supp 2
> Dan lName Supp 3
> 
> South
> 
> John lName Supp 1
> Kathy lName Supp 2
> Dave lName Samuel
> Dan lName Supp 3
> John lName Supp 1
> Kathy lName Supp 2
> Dan lName Supp 3
> 
> This is the stylesheet I used (called:
> sales_by_area.xsl):
> 
> <xsl:key name="areas" match="//Area/*"
> use="name()"/>
> <xsl:key name="supplier-list" match="SalesPerson"
> use="Supplier"/>
> <xsl:key name="fullName" match="SalesPerson"
> use="Name"/>
> 
> <xsl:template match="/">
>          <html>
>          <head>
>                  <meta http-equiv="content-type"
> content="text/html" />
>                  <meta name="description"
> content="Suppliers by Sales 
> People" />
>                  <link  href="text.css"
> rel="stylesheet" type="text/css" />
>                  <title>Your company</title>
>          </head>
>          <body>
>                  <h1>Sales People by Areas <br
> /></h1>
>                  <xsl:for-each 
>
select="//Area/*[generate-id(.)=generate-id(key('areas',
> name()))]">
>                          <xsl:sort
> select="key('areas', name())"/>
>                          <h2><xsl:value-of
> select="name()"/></h2>
>                          <xsl:for-each
> select="key('areas', name())">
>                                  <xsl:sort
> select="key('areas', text())"/>
>                                  <xsl:variable
> name="supplier_name" 
> select="text()">
>                                  </xsl:variable>
>                                  <xsl:variable
> name="area_name" 
> select="name()">
>                                  </xsl:variable>
> 
>                                  <xsl:for-each 
>
select="//SalesPerson[generate-id()=generate-id(key('fullName',
> Name))]">
>                                          <xsl:sort
> select="key('fullName', 
> Name)"/>
>                                         
> <xsl:apply-templates select="Name">
>                                         
> <xsl:with-param name="curr_supp" 
> select="$supplier_name"/>
>                                         
> <xsl:with-param name="curr_area" 
> select="$area_name"/>
>                                         
> </xsl:apply-templates>
>                                  </xsl:for-each>
> 
>                          </xsl:for-each>
>                  </xsl:for-each>
> 
>          </body>
>          </html>
> </xsl:template>
> 
> <xsl:template match="Name">
>          <xsl:param name="curr_supp"/>
>          <xsl:param name="curr_area"/>
> 
>          <xsl:variable name="fName" select=".">
>          </xsl:variable>
> 
>          <xsl:for-each 
>
select="//SalesPerson[generate-id()=generate-id(key('supplier-list',
> 
> Supplier))]">
>                  <xsl:sort
> select="key('supplier-list', Supplier)"/>
>                  <xsl:for-each
> select="key('supplier-list', $curr_supp)">
>                          <xsl:if test="$fName =
> Name">
>                          <xsl:if test="Supplier =
> $curr_supp">
>                                  <p
> class="textenglish">
>                                  <xsl:value-of
> select="Name/FirstName"/>
>                                  <xsl:text>
> </xsl:text>
>                                  <xsl:value-of
> select="Name/LastName"/> <br />
>                                  </p>
>                          </xsl:if>
>                          </xsl:if>
>                  </xsl:for-each>
>          </xsl:for-each>
> 
> </xsl:template>
> </xsl:stylesheet>
 



	
		
__________________________________
Do you Yahoo!?
Win a $20,000 Career Makeover at Yahoo! HotJobs  
http://hotjobs.sweepstakes.yahoo.com/careermakeover 


Current Thread
Keywords
xml