[xsl] Re: Dynamic number of sort key component?

Subject: [xsl] Re: Dynamic number of sort key component?
From: Fabre Lambeau <fabre.lambeau@xxxxxxxxx>
Date: Fri, 14 May 2010 14:45:57 +0100
I'm writing a tool that allows my users to query an XML document
a-la-SQL (but simplified).
For example, given an XML document such as:

<table>
  <row>
    <col name="a">1</col>
    <col name="b">2</col>
    <col name="c">3</col>
    <col name="d">4</col>
  </row>
  <row>
    <col name="a">bla</col>
    <col name="b">bli</col>
    <col name="c">blo</col>
    <col name="d">blu</col>
  </row>
  <!-- ... -->
</table>

I'd like them to be able to say something like:
SELECT a,b,c,d
ORDER BY a ASC,b DESC
GROUP BY a,c,d

My component (XSLT stylesheet) takes that query and effectively
processes it in XSLT.
The GROUP BY statement is easy to process, since I can just
concatenate the values for the corresponding <col> elements, and use
that string as a key to a for-each-group.
However, I can't find a way to do the sorting (for which the order is
different for each individual column).

What I seem to need is the ability to have a dynamic number of sort
key components, which as far as I know is not possible
The following is obviously not possible:
<xsl:perform-sort select="col">
  <xsl:for-each select="tokenize($group-by, ',')">
    <xsl:sort select="col[@name=string-before(current(),' '])
order="{string-after(current(),' ']}ending"/>
  </xsl:for-each>
</xsl:perform>

Can anyone think of a way to do this (whilst retaining the ability to
have a dynamic list of ORDER BY columns, each one specifying its own
order)?
Unfortunately, I don't think I have the ability to generate a separate
XSLT sheet after parsing the query string and execute it, as my engine
is all in XSLT (executed with AltovaXML)

-- 
Fabre Lambeau

Current Thread