- From: Mark Birbeck <mark.birbeck@x-port.net>
- Date: Sat, 16 Apr 2005 15:36:17 +0100
- To: <tvraman@almaden.ibm.com>, <Leigh.Klotz@pahv.xerox.com>
- Cc: <suzan.foster@nerocmediaware.nl>, <www-forms@w3.org>
Raman/Leigh/Suzan,
> An interesting place to start this investigation would be to see if
> exslt.org has already gone down this (x)path of sorting nodes.
EXSLT.org wouldn't need to, since XSLT itself supports
sorting. As Leigh says, though, the XSLT way, may be the
model to look at (see later). First, it might be worth
separating out where we want to do the sorting --
establishing the use cases.
If we want a xf:repeat that behaves like a grid, and (for
example) clicking on the heading of a column sorts by that
column, this actually has nothing to do with the XForms
model, and only relates to the UI. A UI could support this
feature *now* without requiring any changes to XForms.
Similarly, if you want to sort the nodes in a nodeset --
actually re-order them, not just render them differently --
then that can be achieved *now* with an extension function
(most implementations support the definition of extra
functions that are not part of the base spec).
Whilst these use cases can be done now, there are of course
others that can't. The main one is where the *author* wants
the UI to render data in a certain order, independently of
how the user might interact with that data, and also
independently of the order of the instance data.
The two situations where this might be the case would be the
'choices' in an xf:itemset (in xf:select1 and xf:select), and
of course a list of items in a xf:repeat.
A simple solution would be to take attributes much like those
used in XSLT [1] -- as alluded to by Leigh -- and allow them
anywhere that @nodeset is allowed. For example:
<xf:instance>
<countries xmlns="" cur="">
<country id="10" name="USA" />
<country id="20" name="UK" />
<country id="30" name="France" />
</countries>
</xf:instance>
<xf:select1 ref="@cur">
<xf:label>Choose country:</xf:label>
<xf:itemset nodeset="country" sort-key="@name"
order="descending">
<xf:label ref="@name" />
<xf:value ref="@id" />
</xf:itemset>
</xf:select1>
Output:
___________
Choose country: [___________] V
| USA |
| UK |
| France |
|___________|
By allowing these attributes to operate alongside @nodeset,
they would also be available to xf:bind and xf:repeat, too.
However, the obvious next issue would be how to sort by two
(or more) columns. For that we'd probably want to make each
attribute a list:
<xf:instance>
<people xmlns="">
<person id="10" firstname="Leigh" surname="Klotz" />
<person id="20" firstname="Suzan" surname="Foster" />
<person id="10" firstname="T V" surname="Raman" />
</people>
</xf:instance>
<xf:repeat nodeset="person" sort-key="@surname, @firstname">
<xf:output value="concat(@surname, ', ', @firstname)" />
</xf:repeat>
Output:
Foster, Suzan
Klotz, Leigh
Raman, T V
The alternative of using the XSLT approach (specifying the
sort order with child elements) could be done, but might get
a little tricky to define clearly, given that xf:repeat
actually contains the template that is to be repeated:
<xf:repeat nodeset="person">
<xf:sort select="@surname" />
<xf:sort select="@firstname" />
<xf:output value="concat(@surname, ', ', @firstname)" />
</xf:repeat>
Anyway, my main point is that there are plenty of things that
can be done now, without changing the XForms spec, and still
producing interoperable forms. However, there are definitely
situations were we need something more than that.
Regards,
Mark
[1] <http://www.w3.org/TR/xslt.html#sorting>
Mark Birbeck
CEO
x-port.net Ltd.
e: Mark.Birbeck@x-port.net
t: +44 (0) 20 7689 9232
w: http://www.formsPlayer.com/
b: http://internet-apps.blogspot.com/
Download our XForms processor from
http://www.formsPlayer.com/
Received on Saturday, 16 April 2005 14:36:44 UTC