[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: To simulate SORT inside a xsl:choose condition

Subject: RE: To simulate SORT inside a xsl:choose condition
From: "Michael Kay" <michael.h.kay@xxxxxxxxxxxx>
Date: Tue, 30 Apr 2002 08:47:01 +0100
xsl sort inside xsl choose
The most powerful solutions unfortunately require extensions.

There's xx:evaluate():

<xsl:for-each select=".....">
  <xsl:sort select="xx:evaluate($sort-key)"/>

and there's stylesheet-defined functions (here in XSLT 2.0 syntax):

<xsl:for-each select=".....">
  <xsl:sort select="xx:my-function($sort-key)"/>
...

<xsl:function name="xx:my-function">
  <xsl:param name="sort-key"/>
...


Within XSLT 1.0 though there are a number of tricks that can be useful.
There's the exclusive union trick:

<xsl:sort select="key1[condition1] | key2[condition2] | key3[condition3]"/>

where only one of the conditions is actually true.

There's also the dynamic name trick:

<xsl:sort select="*[name()=$param]"/>

and of course if the worst comes to the worst you can always write

<xsl:choose>
<xsl:when test="condition1">
  <xsl:for-each select="$x">
    <xsl:sort select="sort-key-1"/>
    <xsl:call-template name="the-work"/>
  </xsl:for-each>
</xsl:when>
<xsl:when test="condition2">
  <xsl:for-each select="$x">
    <xsl:sort select="sort-key-2"/>
    <xsl:call-template name="the-work"/>
  </xsl:for-each>
</xsl:when>
...

XSLT 2.0 also introduces a sort() function that takes a named sort key as a
parameter, which can be determined at run-time:

<xsl:for-each select="sort($x, if (condition1) then 'sortkey1' else
'sortkey2')">

Michael Kay
Software AG
home: Michael.H.Kay@xxxxxxxxxxxx
work: Michael.Kay@xxxxxxxxxxxxxx

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of KUMAR
> NINGASHETTY
> Sent: 29 April 2002 23:15
> To: <
> Subject:  To simulate SORT inside a xsl:choose condition
>
>
> Hi all ,
>
> I know that the rule to sort  should be immediately after
> <xsl:for-each >
> I am in  a situation where i have to read the  criteria to
> sort  from some some node in the beginning of  XML
> and based on which i need to make a decision to sortBY
> corresponding node somewhere down the line....
>
>
> But  as you know  the following way doesnt work ...
>
> <xsl:for-each select="somenode">
>     <xsl:choose>
>        <xsl;when test="$prevnode = 'criteriavalue' ">
>              <xsl:sort  order="ascending"
> select="node_to_be_sorted"/>
>       </xsl:when>
>     </xsl:choose>
>
> </xsl:for-each>
>
> Note: dont worry about syntax check on this ...
>
> Is there a way to sneak around and get this Sorting to work
> based on some criteria ...Or any other work arounds, suggestions?
>
> thanx in advance
> - kumar
>
>
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>


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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.