10 Sorting
Sorting
<
sort
select=
string-expression
lang=
{
nmtoken
}
data-type=
{
qname-but-not-ncname
}
order=
{
}
case-order=
{
}
>
<-- Content: -->
<
/sort>
Sorting is specified by adding xsl:sort elements as
children of an xsl:apply-templates or
xsl:for-each element. The first xsl:sort
child specifies the primary sort key, the second xsl:sort
child specifies the secondary sort key and so on. When an
xsl:apply-templates or xsl:for-each element
has one or more xsl:sort children, then instead of
processing the selected nodes in document order, it sorts the nodes
according to the specified sort keys and then processes them in sorted
order. When used in xsl:for-each, xsl:sort
elements must occur first. When a template is instantiated by
xsl:apply-templates and xsl:for-each, the
Current Node List list
consists of the complete list of nodes being processed in sorted
order.
xsl:sort has a select attribute whose
value is an Expression. For
each node to be processed, the expression is evaluated with that node
as the current node and with the complete list of nodes being
processed in unsorted order as the current node list.
The resulting object is converted to a string as
if by a call to the string function; this string
is used as the sort key for that node. The default value of the
select attribute is ., which will cause the
string-value of the current node to be used as the sort key.
This string serves as a sort key for the node. The following
optional attributes on xsl:sort control how the list of
sort keys are sorted; the values of all of these attributes are
interpreted as Attribute Value Template.
-
order specifies whether the strings should be
sorted in ascending or descending order; ascending
specifies ascending order; descending specifies
descending order; the default is ascending
-
lang specifies the language of the sort keys; it
has the same range of values as xml:lang [XML]; if no lang value is specified, the language
should be determined from the system environment
-
data-type specifies the data type of the
strings; the following values are allowed:
-
text specifies that the sort keys should be
sorted lexicographically in the culturally correct manner for the
language specified by lang
-
number specifies that the sort keys should be
converted to numbers and then sorted according to the numeric value;
the sort key is converted to a number as if by a call to the
number function; the lang
attribute is ignored
-
a QName with a prefix
is expanded into an expanded-name as described
in [Qualified Names]; the expanded-name identifies the data-type;
the behavior in this case is not specified by this document
The default value is text.
NOTE:
The XSL Working Group plans that future versions of XSLT will
leverage XML Schemas to define further values for this
attribute.
-
case-order has the value
upper-first or lower-first; this applies
when data-type="text", and specifies that upper-case
letters should sort before lower-case letters or vice-versa
respectively. For example, if lang="en", then A a B
b are sorted with case-order="upper-first" and
a A b B are sorted with
case-order="lower-first". The default value is language
dependent.
NOTE:
It is possible for two conforming XSLT processors not to sort
exactly the same. Some XSLT processors may not support some
languages. Furthermore, there may be variations possible in the
sorting of any particular language that are not specified by the
attributes on xsl:sort, for example, whether Hiragana or
Katakana is sorted first in Japanese. Future versions of XSLT may
provide additional attributes to provide control over these
variations. Implementations may also use implementation-specific
namespaced attributes on xsl:sort for this.
NOTE:
It is recommended that implementers consult [UNICODE-TR10] for information on internationalized
sorting.
The sort must be stable: in the sorted list of nodes, any sub list
that has sort keys that all compare equal must be in document
order.
For example, suppose an employee database has the form
<employees>
<employee>
<name>
<given>James</given>
<family>Clark</family>
</name>
...
</employee>
</employees>
Then a list of employees sorted by name could be generated
using:
<xsl:template match="employees">
<ul>
<xsl:apply-templates select="employee">
<xsl:sort select="name/family"/>
<xsl:sort select="name/given"/>
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="employee">
<li>
<xsl:value-of select="name/given"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name/family"/>
</li>
</xsl:template>
|