AW: [xsl] sort on one key - duplicates

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