| <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 | |
|
|
| 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. |
|