XSLT - Sorting XML Data Using <xsl:sort>?

Sorting is one of the most important operations in XSLT because XML data is often stored in an order that may not be suitable for presentation. The <xsl:sort> element allows developers to rearrange XML nodes before displaying or processing them. By using sorting, data can be organized alphabetically, numerically, or according to custom criteria, making the output more readable and useful.

Understanding <xsl:sort>

The <xsl:sort> element is typically used inside <xsl:for-each> or <xsl:apply-templates>. It specifies how selected nodes should be ordered before processing.

Syntax

<xsl:for-each select="node-set">
    <xsl:sort select="expression"/>
</xsl:for-each>

The select attribute determines the value used for sorting. XSLT evaluates this expression for each node and arranges the nodes according to the resulting values.

Example XML Document

Consider the following XML file containing employee information:

<employees>
    <employee>
        <name>Ravi</name>
        <salary>45000</salary>
    </employee>
    <employee>
        <name>Anita</name>
        <salary>60000</salary>
    </employee>
    <employee>
        <name>Karan</name>
        <salary>50000</salary>
    </employee>
</employees>

Sorting Employees by Name

The following XSLT sorts employees alphabetically by name:

<xsl:template match="/">
    <html>
        <body>
            <h2>Employee List</h2>
            <ul>
                <xsl:for-each select="employees/employee">
                    <xsl:sort select="name"/>
                    <li>
                        <xsl:value-of select="name"/>
                    </li>
                </xsl:for-each>
            </ul>
        </body>
    </html>
</xsl:template>

Output

Anita
Karan
Ravi

Although Ravi appears first in the XML file, the output is displayed in alphabetical order because of <xsl:sort>.

Sorting Numerical Values

By default, XSLT performs text-based sorting. When working with numbers, it is important to specify numeric sorting.

Example

<xsl:for-each select="employees/employee">
    <xsl:sort select="salary" data-type="number"/>
    <p>
        <xsl:value-of select="name"/> -
        <xsl:value-of select="salary"/>
    </p>
</xsl:for-each>

Output

Ravi - 45000
Karan - 50000
Anita - 60000

The employees are sorted according to salary values in ascending numerical order.

Ascending and Descending Order

The order attribute controls whether sorting is performed in ascending or descending order.

Ascending Order

<xsl:sort select="salary"
          data-type="number"
          order="ascending"/>

Descending Order

<xsl:sort select="salary"
          data-type="number"
          order="descending"/>

Descending Output

Anita - 60000
Karan - 50000
Ravi - 45000

This is useful when displaying rankings, top-performing employees, highest-priced products, or other ordered data.

Sorting Text Data

Text values are sorted alphabetically.

Example

<xsl:sort select="name"
          data-type="text"/>

Output:

Anita
Karan
Ravi

This method is commonly used for customer names, city names, product names, and book titles.

Multiple-Level Sorting

Sometimes a single sorting condition is not enough. XSLT allows multiple <xsl:sort> elements to define secondary sorting rules.

Example XML

<employees>
    <employee>
        <department>IT</department>
        <name>Ravi</name>
    </employee>

    <employee>
        <department>HR</department>
        <name>Anita</name>
    </employee>

    <employee>
        <department>IT</department>
        <name>Karan</name>
    </employee>
</employees>

XSLT

<xsl:for-each select="employees/employee">
    <xsl:sort select="department"/>
    <xsl:sort select="name"/>
    <p>
        <xsl:value-of select="department"/>
        -
        <xsl:value-of select="name"/>
    </p>
</xsl:for-each>

Output

HR - Anita
IT - Karan
IT - Ravi

The data is first sorted by department and then by employee name within each department.

Case-Sensitive Sorting

Different XSLT processors may handle uppercase and lowercase letters differently during sorting.

Example:

Apple
banana
Cherry

Without special handling, uppercase values may appear before lowercase values. To ensure consistent sorting, functions such as lower-case() in XSLT 2.0 and above can be used.

Example

<xsl:sort select="lower-case(name)"/>

This ensures that sorting is performed without considering letter case.

Sorting Dates

Dates stored in a standard format such as YYYY-MM-DD can be sorted directly.

Example XML

<orders>
    <order>
        <date>2025-05-15</date>
    </order>
    <order>
        <date>2024-12-10</date>
    </order>
</orders>

XSLT

<xsl:sort select="date"/>

Output

2024-12-10
2025-05-15

The dates are arranged chronologically.

Sorting During Template Processing

Sorting can also be applied when using <xsl:apply-templates>.

Example

<xsl:apply-templates select="employees/employee">
    <xsl:sort select="name"/>
</xsl:apply-templates>

This allows templates to process nodes in a sorted order without using <xsl:for-each>.

Common Attributes of <xsl:sort>

Attribute Purpose
select Specifies the value used for sorting
order Defines ascending or descending order
data-type Specifies whether values are text or numbers
lang Defines language-specific sorting rules
case-order Controls ordering of uppercase and lowercase letters

Benefits of Using <xsl:sort>

  1. Improves readability of transformed data.

  2. Enables alphabetical and numerical organization.

  3. Supports complex multi-level sorting.

  4. Helps generate professional reports and listings.

  5. Reduces the need for external sorting logic.

  6. Works seamlessly with template processing.

  7. Supports dynamic data presentation.

Best Practices

  1. Always specify data-type="number" when sorting numerical values.

  2. Use multiple <xsl:sort> elements for hierarchical sorting.

  3. Test sorting behavior with different XSLT processors.

  4. Normalize text case when consistent alphabetical order is required.

  5. Keep sorting logic simple and easy to maintain.

  6. Use standard date formats for accurate date sorting.

Conclusion

The <xsl:sort> element is a powerful feature in XSLT that enables the arrangement of XML data according to specific criteria before output generation. Whether sorting names alphabetically, salaries numerically, dates chronologically, or applying multiple levels of sorting, <xsl:sort> provides a flexible and efficient mechanism for organizing data. Proper use of sorting enhances the clarity, usability, and professionalism of XML transformations, making it an essential tool for XSLT developers.