XSL reference documentation generated from the W3C Recommendation 16 November 1999
<sort>
select = string-expression
lang =
data-type =
order =
case-order =
Model: EMPTY
</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
xsl:sort has a select attribute whose
value is an 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
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
lang
attribute is ignored
a QName with a prefix is expanded into an expanded-name as described in qname; 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>