xsl-list
[Top] [All Lists]

Re: Grouping problem - Duplicates

2004-04-30 10:48:45
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="{(_at_)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="{(_at_)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(_at_)GameBox(_dot_)net> 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 


<Prev in Thread] Current Thread [Next in Thread>