Re: [xsl] To simulate SORT inside a xsl:choose condition

Subject: Re: [xsl] To simulate SORT inside a xsl:choose condition
From: "KUMAR NINGASHETTY" <kningashetty@xxxxxxxxxxxxxxxx>
Date: Mon, 29 Apr 2002 19:36:38 -0400
Thanx for all your replies ...

As per Dion and Faron suggested...I have to  loop twice or applytemplates twice inorder to achieve this ..The processing inside this for-loop or apply-templates that goes in is lot in my case...so i was trying to avoid this...

I tried Joerg's idea....I am getting syntax errors...

To make things clear ...THis is what i have ...

<data>
   <criteria>
        <sortby><![CDATA[city]]></sortBy>
   </criteria>
   <loo>
           <reg id="204">
	<region_name><![CDATA[Region 5]]></region_name>
	<username userid="1017"><![CDATA[name1]]></username>
               <username userid="8248"><![CDATA[name2]]></username>    
           </reg>
   </loo>
   <company>
        <regions  useridref="1017">
             <comp_name>aaa</comp_name>
             <city>york</city>
        </regions>
        <regions  useridref="8248">
           <comp_name>bbb</comp_name>
           <city>jersey</city>
        </regions>
    </company>
</data>


I have written XSL to display city, companyname in Table structure .based on the criteria node's sorting i will have to either sort the data by City or Comp_name 
when it appears for the first time ...

I tried this ..globally i did 
<xsl:variable name="sortmethod" select="//criteria/sortby">

SOmewhere down in my template where i write xsl:for i do this ....
<xsl:for-each select="//regions">
      <xsl:sort  order="ascending"  select="name()=$sortmethod"/>
</xsl:for-each>

Does that work??



-kumar


 
>>> gfaron@xxxxxxxxxxxxxxxxxx 04/29/02 06:38PM >>>
At 04:15 PM 4/29/2002, you wrote:
>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?

   I think the answer depends on what the tests are (e.g. What is 
$prevnode?).  If your test is based on some value of the nodes selected by 
the for-each, then you're asking to re-order everything after you get and 
test the first item.  This is not good.  The workaround here is to select 
items based on that value in the original for-each selection.

   If, on the other hand, your tests are based on some external value, it's 
pretty easy.  You just create multiple for-each's and only execute the one 
you need.
<xsl:choose>
   <xsl:when test="$prevnode='criteriavalue1'">
     <xsl:for-each select="somenode">
       <xsl:sort order="ascending" select="node_to_be_sorted"/>
     </xsl:for-each>
   </xsl:when>
   <xsl:when test="$prevnode='criteriavalue2'">
     <xsl:for-each select="somenode">
       <xsl:sort order="descending" select="other_node_to_be_sorted"/>
     </xsl:for-each>
   </xsl:when>
</xsl:choose>


Greg Faron
Integre Technical Publishing Co.



 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