[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Grouping problem - Duplicates
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>
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|