Re: [xsl] a sorting conundrum

Subject: Re: [xsl] a sorting conundrum
From: Kevin Rodgers <kevin.rodgers@xxxxxxx>
Date: Thu, 3 Mar 2005 08:43:50 -0700
John Fitzgibbon writes:
> I am attempting to sort an a list of personal names. All of the names
> consist of either a first name followed by a last name or of a last name
> only (there are no middle names). Both parts of the name, when present,
> are enclosed within the one tag (span) which has a class='person'
> attribute, the same tag is used to enclose a last name only. I am
> attempting to sort by last name like so
> <xsl:for-each select="html/body//span[@class='person']">
> <xsl:sort select="substring-after(., ' ')"/>
> <xsl:sort select="."/>
> <xsl:sort select="substring-before(., ' ')"/>
> The problem is that names consisting of a last name only appear first in
> my alphabetical sequence and are sorted; these are followed by names
> with a first name and a last name and these are also sorted. I require
> one alphabetical list rather than two.
> Can this be done in one fell swoop, without having to write an XSL style
> sheet for the file consisting of two alphabetical sequences?

How about (in XSLT 2.0):

<xsl:sort select="if (contains(., ' ')
                  then substring-after(., ' ')
                  else ."/>
<xsl:sort select="if (contains(., ' ')
                  then substring-before(., ' ')
                  else ''"/>

Kevin Rodgers

Current Thread