This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: To simulate SORT inside a xsl:choose condition
- From: "KUMAR NINGASHETTY" <kningashetty at deltafunding dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Mon, 29 Apr 2002 19:36:38 -0400
- Subject: Re: [xsl] To simulate SORT inside a xsl:choose condition
- Reply-to: xsl-list at lists dot mulberrytech dot com
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@integretechpub.com 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