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

Re: generic sort based on attribute names

Subject: Re: generic sort based on attribute names
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Sun, 23 Jan 2005 21:05:59 +1100
xsltsort example
In XSLT 2.0 + FXSL one could write the following:

 <xsl:perform-sort select="/*/e">
   <xsl:sort select=
     "f:apply(f:flip(f:string-join(),''), 
                  f:xsltSort( f:map(f:name(), f:attributes(.)),
                                  f:data()
                                  )
                   )"/>
 </xsl:perform-sort>

and this produces the desired result:

<e z="zz" a="aa"/>
<e b="bb" y="yy"/>


This can probably be written as a single XPath expression using nested
f:xsltSort(), but this would be not too easy to understand.

f:xsltSort() is an interesting function, based on xsl:perform-sort:

 <xsl:function name="f:xsltSort" as="item()*">
   <xsl:param name="pSeq" as="item()*"/>
   <xsl:param name="pCriteria" as="node()*"/>
   
   <xsl:perform-sort select="$pSeq">
     <xsl:sort select="f:compose-flist($pCriteria, .)"/>
   </xsl:perform-sort>
 </xsl:function> 


It is an XPath shorthand of xsl:perform-sort, with the peculiarity,
that the functions to be used as sort keys must be passed in reverse
order (composition takes place from right to left).

Also, it is not possible to define a function for any arbitrary
expression on the fly -- this would have been possible if we had the
facility to specify Lambda functions in XPath, but as we know, no
function definition is possible within XPath.

Cheers,
Dimitre Novatchev.




On Sat, 22 Jan 2005 19:23:21 -0800, Chaitanya Desai <cdesai@xxxxxxxxxxx> wrote:
> 
> Hi,
> I am trying to write a generic sort that uses the 'concatenated
> name-value pairs of all attributes sorted' as the key to sort elements
> at a particular level.
> Example
> Suppose
> <root>
> <e b="bb" y="yy"/>
> <e z="zz" a="aa"/>
> </root>
> is the XML I want to sort.
> The result of the sort should be
> <root>
>  <e a="aa" z="zz" />
>  <e b="bb" y="yy" />
> </root>
> Thus the attributes within an element are sorted and then the key used
> for sorting elements would be:
> 'az' and 'by' respectively (thus 'az' < 'by').
> I am able to sort attributes within an element.
> But I am having trouble setting the key to sort for elements.
> Any help would be greatly appreciated.
> Thanks
> Chaitanya

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.