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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Grouping problem - Duplic, Michael Kay | Thread | RE: [xsl] Grouping problem - Duplic, Jacoby, Peter R. |
RE: [xsl] Grouping problem - Duplic, Jacoby, Peter R. | Date | [xsl] Scaling external-graphic with, MJ Suhonos |
Month |