Re: [xsl] Sorting on a transformed string?

Subject: Re: [xsl] Sorting on a transformed string?
From: David Carlisle <davidc@xxxxxxxxx>
Date: Tue, 29 Oct 2002 10:25:33 GMT


>    From: Scott Bronson <bronson@xxxxxxxxxxx>
>    Date: 26 Oct 2002 09:57:54 -0700
> 
>    Hello.  A sort problem is stumping me right now.  I've got the following
>    nodes:
> 
>        <Member name="CreateInstance">
>        <Member name="System.Caption.Insert">
>        <Member name="System.Collections.ICollection.Count"
> 
>    I'd like to sort them by name, without leading namespace:
> 
>        Count, CreateInstance, Insert
> 
>    Then I'd like to output them, WITH the namespace:
> 
>        System.Collections.ICollection.Count
>        CreateInstance
>        System.Caption.Insert
> 
>    Normally, I use leaf-name (below) to trim the namespace.  However, I
>    suspect it's impossible to get sort to use a named template, and I
>    haven't figured out any other way of figuring out the leaf name.
> 
>    Is possible to sort on the leaf name?  Is it possible in XML 1.0?  :)
> 
>    Thank you!
> 
>        - Scott






<x>
    <Member name="CreateInstance"/>
    <Member name="System.Caption.Insert"/>
    <Member name="System.Collections.ICollection.Count"/>
</x>






<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0"
>

<xsl:template match="x">
<xsl:for-each select="Member">
<xsl:sort select="concat(
 substring-after(substring-after(substring-after(@name,'.'),'.'),'.')  ,
 substring-after(substring-after(@name[not(contains(substring-after(substring-after(.,'.'),'.'),'.'))],'.'),'.') ,
substring-after(@name[not(contains(substring-after(.,'.'),'.'))],'.') ,
@name[not(contains(.,'.'))]  )"/>

member: <xsl:value-of select="@name"/>
sorted by: <xsl:value-of select="concat(
 substring-after(substring-after(substring-after(@name,'.'),'.'),'.')  ,
 substring-after(substring-after(@name[not(contains(substring-after(substring-after(.,'.'),'.'),'.'))],'.'),'.') ,
substring-after(@name[not(contains(substring-after(.,'.'),'.'))],'.') ,
@name[not(contains(.,'.'))]  )"/>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>




$ saxon sort.xml sort.xsl
<?xml version="1.0" encoding="utf-8"?>

member: System.Collections.ICollection.Count
sorted by: Count

member: CreateInstance
sorted by: CreateInstance

member: System.Caption.Insert
sorted by: Insert


David






_____________________________________________________________________
This message has been checked for all known viruses by Star Internet
delivered through the MessageLabs Virus Scanning Service. For further
information visit http://www.star.net.uk/stats.asp or alternatively call
Star Internet for details on the Virus Scanning Service.

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


Current Thread