<xsl:sort> |
Defines a sort key for the current context. This element appears as a child of the <xsl:apply-templates> or <xsl:for-each> elements. Within those elements, the first <xsl:sort> defines the primary sort key, the second <xsl:sort> defines the secondary sort key, etc.
Category
Subinstruction (<xsl:sort> always appears as a child of the <xsl:apply-templates> or <xsl:for-each> elements)
Required Attributes
None.
Optional Attributes

select
  An XPath expression that defines the nodes to be sorted.

lang
  A string that defines the language used by the sort. The language codes are defined in RFC1766, available at http://www.ietf.org/rfc/rfc1766.txt .

data-type
  An attribute that defines the type of the items to be sorted. Allowable values are number and text ; the default is text . An XSLT processor has the option of supporting other values as well. Sorting the values 32 10 120 with data-type= " text " returns 10 120 32 , while data-type= " number " returns 10 32 120 .

order
  An attribute that defines the order of the sort. Allowable values are ascending and descending .

case-order
  An attribute that defines the order in which upper- and lowercase letters are sorted. Allowable values are upper-first and lower-first .

Content
None.
Appears in
<xsl:apply-templates> and <xsl:for-each>.
Defined in
XSLT section 10, Sorting.
Example
We'll illustrate <xsl:sort> with this stylesheet:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:output method="text"/>

      <xsl:variable name="newline">
    <xsl:text>
    </xsl:text>
      </xsl:variable>

      <xsl:template match="/">
        <xsl:value-of select="$newline"/>
        <xsl:call-template name="ascending-alpha-sort">
          <xsl:with-param name="items" select="/sample/textlist/listitem"/>
        </xsl:call-template>
        <xsl:call-template name="ascending-alpha-sort">
          <xsl:with-param name="items" select="/sample/numericlist/listitem"/>
        </xsl:call-template>
        <xsl:call-template name="ascending-numeric-sort">
          <xsl:with-param name="items" select="/sample/numericlist/listitem"/>
        </xsl:call-template>
        <xsl:call-template name="descending-alpha-sort">
          <xsl:with-param name="items" select="/sample/textlist/listitem"/>
        </xsl:call-template>
      </xsl:template>

      <xsl:template name="ascending-alpha-sort">
        <xsl:param name="items"/>
        <xsl:text>Ascending text sort:</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:for-each select="$items">
          <xsl:sort select="."/>
          <xsl:value-of select="."/>
          <xsl:value-of select="$newline"/>
        </xsl:for-each>
        <xsl:value-of select="$newline"/>
      </xsl:template>

      <xsl:template name="descending-alpha-sort">
        <xsl:param name="items"/>
        <xsl:text>Descending text sort:</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:for-each select="$items">
          <xsl:sort select="." order="descending"/>
          <xsl:value-of select="."/>
          <xsl:value-of select="$newline"/>
        </xsl:for-each>
        <xsl:value-of select="$newline"/>
      </xsl:template>

      <xsl:template name="ascending-numeric-sort">
        <xsl:param name="items"/>
        <xsl:text>Ascending numeric sort:</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:for-each select="$items">
          <xsl:sort select="." data-type="number"/>
          <xsl:value-of select="."/>
          <xsl:value-of select="$newline"/>
        </xsl:for-each>
        <xsl:value-of select="$newline"/>
      </xsl:template>

    </xsl:stylesheet>
Our stylesheet defines three named templates, each of which sorts <listitem>s in a different order or with a different data-type. We'll use this stylesheet against this document:
    <?xml version="1.0"?>
    <sample>
      <numericlist>
        <listitem>1</listitem>
        <listitem>3</listitem>
        <listitem>23</listitem>
        <listitem>120</listitem>
        <listitem>2</listitem>
      </numericlist>
      <textlist>
        <listitem>3</listitem>
        <listitem>apple</listitem>
        <listitem>orange</listitem>
        <listitem>dragonfruit</listitem>
        <listitem>carambola</listitem>
      </textlist>
    </sample>
Here are the results:
    Ascending text sort:
    3
    apple
    carambola
    dragonfruit
    orange

    Ascending text sort:
    1
    120
    2
    23
    3

    Ascending numeric sort:
    1
    2
    3
    23
    120

    Descending text sort:
    orange
    dragonfruit
    carambola
    apple
    3
Notice that the data-type="numeric" attribute causes data to be sorted in numeric order.