xsl-list
[Top] [All Lists]

Grouping problem - Duplicates

2004-04-30 02:31:54
Hi,

I am new to XSLT. I am trying to sort an XML file and display the output as a simple html report with no repetitions.
I cannot find the way to do it.
I would appreciate help, very much.

Thanks, Sarah

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>




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