> 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.
|