Subject: Re: [xsl] RE: (Keys on multiple element types) From: "Ahmad J. Reeves" <ahmad@xxxxxxxxxxxxxx> Date: Tue, 05 Feb 2002 13:57:42 +0000 |
Hi Jen, OK, so if I do <xsl:key name="rows" match="FILES/*" use="concat(name(), '+', name)" /> <xsl:template match="FILES"> <xsl:apply-templates select="*[generate-id(.) = generate-id(key('rows', concat(name(), '+', name))[1])]"/> </xsl:template> <xsl:template match="FILES/*"> <xsl:value-of select="name"/> <xsl:for-each select="key('rows', name)"> <xsl:value-of select="$newline"/> <xsl:value-of select="project_name"/> <xsl:value-of select="$newline"/> </xsl:for-each> </xsl:template> I get FredFredHarry. So its removed the extra Fred but doesnt print the project_names. If I change this so that instead of name I group by project-name..thus <xsl:key name="rows" match="FILES/*" use="concat(name(), '+', project_name)" /> <xsl:template match="FILES"> <xsl:apply-templates select="*[generate-id(.) = generate-id(key('rows', concat(name(), '+', project_name))[1])]"/> </xsl:template> <xsl:template match="FILES/*"> <xsl:value-of select="name"/> <xsl:for-each select="key('rows', project_name)"> <xsl:value-of select="$newline"/> <xsl:value-of select="project_name"/> <xsl:value-of select="$newline"/> </xsl:for-each> </xsl:template> I expect the output Fred Building Fred Looking Harry Writing but instead still get FredFredHarry. What am I doing/thinking wrong? Ahmad p.s many thanks for your gracious patience and politeness. At 11:55 AM 2/5/02 +0000, you wrote: >Hi Ahmad, > >> You are correct in that I am trying to get to grips with keys, but I >> didnt appreciate that they automatically removed duplicates based on >> certain conditions, i.e if two say <project> nodes were the same. > >The keys don't; using the Muenchian method (which uses keys for >efficiency) does. The duplicates are removed by the statement: > > *[generate-id(.) = generate-id(key('rows', name)[1])] > >where you select all the elements that are the same element as the >element you get when you use the 'rows' key with that element's name >(i.e. selects the first element with a particular name in the >document). The other elements with that name are still there. > >> Jeni's reply would be to use: - >> >> <xsl:key name="rows" match="FILES/*" >> use="concat(project(), '+', name)" /> > >I suggested: > ><xsl:key name="rows" match="FILES/*" > use="concat(name(), '+', name)" /> > >Note that name() is an XPath function that retrieves the name of a >node (in this case the name of the element that you're indexing with >the key) - in your examples it would return things like 'RECORDA', >'RECORDB' or 'RECORDC'. That means that the key values would be things >like 'RECORDA+Fred' or 'RECORDC+Harry'. To get the unique values, >you'd need: > > *[generate-id(.) = > generate-id(key('rows', concat(name(), '+', name))[1])] > >You might find http://www.jenitennison.com/xslt/grouping helpful. > >Cheers, > >Jeni > >--- >Jeni Tennison >http://www.jenitennison.com/ > > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > > ------------------------------------------------- Ahmad J Reeves BSc (Hons) MSc (Dist) PhD Student Information, Media & Communication Research Group Department of Computer Science Queen Mary, University of London E1 4NS Tel +44(0) 207 882 5257 Fax +44(0) 208 980 6533 http://www.dcs.qmw.ac.uk/imc XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] RE: (Keys on multiple ele, Jeni Tennison | Thread | Re: [xsl] RE: (Keys on multiple ele, Jeni Tennison |
RE: [xsl] RE: Muenchian technique, , Michael Kay | Date | RE: [xsl] RE: Muenchian technique, , DPawson |
Month |