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