xsl-list
[Top] [All Lists]

Re: generic sort based on attribute names

2005-01-23 03:05:59
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(_at_)syncata(_dot_)com> 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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--