[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: sort on one key - duplicates
> On 7 Mar 2017, at 09:44, Dr. Patrik Stellmann patrik.stellmann@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > Hi Raimund, > > You could just replace the "l_name" by "concat(l_name, ' ', f_name)" within the xsl:key, key() and xsl:sort. A better solution is to use a multi-part sort key: <xsl:for-each ... <xsl:sort select="l_name"/> <xsl:sort select="f_name"/> The results will only be different if either (a) your default collation ignores spaces, or (b) the names you are sorting on include spaces Michael Kay Saxonica > > > ------------------------------------------------------------------ > 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: 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.
|
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
|