Subject: AW: [xsl] sort on one key - duplicates From: "Dr. Patrik Stellmann patrik.stellmann@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Tue, 7 Mar 2017 09:44:34 -0000 |
Hi Raimund, You could just replace the "l_name" by "concat(l_name, ' ', f_name)" within the xsl:key, key() and xsl:sort. BTW: Since the 2nd and 3rd for-each loops are identical you might consider putting them into a separate template to avoid duplicated code. Regards, Patrik ------------------------------------------------------------------ Systemarchitektur & IT-Projekte Tel: +49 40 33449-1142 Fax: +49 40 33449-1400 E-Mail: mailto:Patrik.Stellmann@xxxxxxxxx -----UrsprC<ngliche Nachricht----- Von: Raimund Kammering raimund.kammering@xxxxxxx [mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx] Gesendet: Dienstag, 7. MC$rz 2017 10:32 An: xsl-list@xxxxxxxxxxxxxxxxxxxxxx Betreff: [xsl] sort on one key - duplicates Hi Folks, I have an XSL which pulls out all last names and creates a sorted list of these. Works fine, but now I noticed that for duplicated last names only the first person is created in the output! So I need to also take the first name into account! But Ibm lacking the idea to accomplish this! The XML, XSL looks like this: <list> <subject name=bA"> <person> <l_name>Doe</l_name> <f_name>John</f_name> <expert/> <mail>john.doe@xxxxxxxxxxxxx</mail> </person> <person> <l_name>Doe</l_name> <f_name>Johanna</f_name> <expert/> <mail>johanna.doe@xxxxxxxxxxxxx</mail> </person> </subject> <subject name=bBb> <person> <l_name>Mueller</l_name> <f_name>Michael</f_name> <expert/> <mail>michael.mueller@xxxxxxxxxxxxx</mail> </person> <person> <l_name>Mueller</l_name> <f_name>Joe</f_name> <expert/> <mail>joe.mueller@xxxxxxxxxxxxx</mail> </person> </subject> </list> with the following XSL <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output indent="yes" method="xml"/> <!-- Needed to avoid duplicates in "All" subject see: --> <!-- http://www.jenitennison.com/xslt/grouping/muenchian.htm --> <xsl:key name="l_names" match="subject/person" use="l_name"/> <xsl:template match="/list"> <xsl:choose> <xsl:when test="count(./*[@name='All']) = 0"> <xsl:element name="{name()}"> <xsl:element name="subject"> <xsl:attribute name="name">All</xsl:attribute> <xsl:for-each select="subject/person[count(. | key('l_names', l_name)[1]) = 1]"> <xsl:sort select="l_name"/> <xsl:element name="person"> <xsl:copy-of select="l_name"/> <xsl:copy-of select="f_name"/> <xsl:element name="expert"/> <xsl:copy-of select="mail"/> </xsl:element> </xsl:for-each> </xsl:element> <xsl:for-each select="subject"> <xsl:element name="{name()}"> <xsl:attribute name="name"> <xsl:value-of select="@*"/> </xsl:attribute> <xsl:for-each select="person"> <xsl:sort select="l_name"/> <xsl:copy-of select="."/> </xsl:for-each> </xsl:element> </xsl:for-each> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:element name="{name()}"> <xsl:for-each select="subject"> <xsl:element name="{name()}"> <xsl:attribute name="name"> <xsl:value-of select="@*"/> </xsl:attribute> <xsl:for-each select="person"> <xsl:sort select="l_name"/> <xsl:copy-of select="."/> </xsl:for-each> </xsl:element> </xsl:for-each> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> <list> <subject name=bAll"> <person> <l_name>Doe</l_name> <f_name>John</f_name> <expert/> <mail>john.doe@xxxxxxxxxxxxx</mail> </person> <person> <l_name>Mueller</l_name> <f_name>Michael</f_name> <expert/> <mail>michael.mueller@xxxxxxxxxxxxx</mail> </person> </subject> <subject name=bA"> <person> <l_name>Doe</l_name> <f_name>John</f_name> <expert/> <mail>john.doe@xxxxxxxxxxxxx</mail> </person> <person> <l_name>Doe</l_name> <f_name>Johanna</f_name> <expert/> <mail>johanna.doe@xxxxxxxxxxxxx</mail> </person> </subject> <subject name=bBb> <person> <l_name>Mueller</l_name> <f_name>Michael</f_name> <expert/> <mail>michael.mueller@xxxxxxxxxxxxx</mail> </person> <person> <l_name>Mueller</l_name> <f_name>Joe</f_name> <expert/> <mail>joe.mueller@xxxxxxxxxxxxx</mail> </person> </subject> </list> which produces the requested output except for that in the bAllb list is only filled the first one of a person which name is appearing multiple times! So I need to in addition to the key on l_name need to also take the f_name into account! Raimund GDV Dienstleistungs-GmbH GlockengieCerwall 1 D-20095 Hamburg www.gdv-dl.de Sitz und Registergericht: Hamburg HRB 145291 USt.-IdNr : DE 205183123 GeschC$ftsfC<hrer: Dr. Jens Bartenwerfer Michael Bathke ------------------------------------------------------------------ Diese E-Mail und alle AnhC$nge enthalten vertrauliche und/oder rechtlich geschC<tzte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtC<mlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese E-Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe der E-Mail ist nicht gestattet. This e-mail and any attached files may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorised copying, disclosure or distribution of the material in this e-mail is strictly forbidden.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] sort on one key - duplicates, Raimund Kammering ra | Thread | Re: [xsl] sort on one key - duplica, Michael Kay mike@xxx |
[xsl] sort on one key - duplicates, Raimund Kammering ra | Date | Re: [xsl] whitespace normalization , Flynn, Peter pflynn@ |
Month |