Subject: RE: [xsl] Grouping problem - Duplicates From: "Michael Kay" <mhk@xxxxxxxxx> Date: Fri, 30 Apr 2004 13:37:53 +0100 |
> Thanks for the info, I have read that article before asking > my question. OK, you said you were a beginner, and I made the mistake of believing you. I'm afraid this now fails my one-minute test: if I don't understand the problem after staring at it for a minute, I leave it to someone else. Sorry! Michael Kay > Still, I need help. I am not sure that what I want to get as > output can be > done in one stylesheet (without first creating a sorted XMl > output to be > processed with a different stylesheet). > > The structure of the XML file is of two "foreign"groups, <Area> and > <SalesPeople>, yet the grouping of the 2nd level sort, from > <salesPeople>, > depends on the node names from <Area>. > > Sarah > > Here is the question again: > > ---- 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>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Grouping problem - Duplic, Sarah | Thread | Re: [xsl] Grouping problem - Duplic, Mukul Gandhi |
RE: [xsl] Grouping problem - Duplic, Sarah | Date | RE: [xsl] xmlns="" ??, Mullee, John |
Month |