Ultimate arbitrary sort algorithm :-)

Subject: Ultimate arbitrary sort algorithm :-)
From: Oliver Becker <obecker@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 8 Aug 2000 11:16:35 +0200 (MET DST)
Hello world, dear order fanciers!

Unfortunately I deleted a mail asking for sorting a list of names
by ignoring leading "Re: " and treating "Mc" and "Mac" the same.

Mike Kay answered something like "it's not possible to construct
a key expression that requires conditional processing".

As we've learned from the intersection expression: never say never! :-)

In the following I try to explain a method to construct such an
expression - only by XPath means. Decide yourself wether the result
is rather pretty or rather ugly ...

xsl:sort requires an expression used as the sort key.
What we want is the following:
   if condition1 then use string1 as sort key
   if condition2 then use string2 as sort key
   etc.

How to achieve that?
The following expression gives $string if $condition is true,
otherwise it results in an empty string:
   substring($string, 1 div number($condition))
Regarding to Mike's book this is perfectly valid.
(Note: works with Saxon and XT, but not with my versions of Xalan and
Oracle XSL - but I've not installed the latest versions ...)

If you don't like "infinity" - here's another solution:
   substring($string, 1, number($condition)*string-length($string))
but then you need $string twice ...

The concatenation of all these substring expressions forms the sort key.
Requirement: all conditions must be mutually exclusive.

That's all! :-)

Here's my example which demonstrates the handling of leading "Re: "s.
If the string starts with "Re: ", an equivalent string without this
prefix but with an appended ", Re" forms the key, otherwise the
original string is used:

<xsl:sort select="concat(
   substring(concat(substring-after(.,'Re: '), ', Re'), 
             1 div number(starts-with(.,'Re: '))),
   substring(., 1 div number(not(starts-with(.,'Re: ')))))" />

As you may imagine these expressions could become very complex the more
arbitrary you want to sort. (I've not tried to work out the full problem
regarding "Mc" and "Mac" - however, the method should be clear.)

Pretty or ugly?
But it's XSLT 1.0!

Cheers,
Oliver


/-------------------------------------------------------------------\
|  ob|do        Dipl.Inf. Oliver Becker                             |
|  --+--        E-Mail: obecker@xxxxxxxxxxxxxxxxxxxxxxx             |
|  op|qo        WWW:    http://www.informatik.hu-berlin.de/~obecker |
\-------------------------------------------------------------------/


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread