Сортировка
В предыдущих примерах порядок строк в таблице полностью соответствовал группам тегов в XML-файле. Этот порядок можно изменять. Добавим в тег
<xsl:for-each select="tutorial/enimals/dogs/dog">
атрибут order-by
<xsl:for-each select="tutorial/enimals/dogs/dog" order-by="dogName">
Наша таблица примет вид (, ).
Кличка | Вес | Цвет |
Бобик | 2 кг | бело-серый |
Трезор | 25 кг | черный |
Тузик | 10 кг | белый с черными пятнами |
Шарик | 18 кг | рыжий с черными подпалинами |
Более интересные результаты мы получим, если попытаемся отсортировать таблицу по столбцу "Вес". Вначале попробуем сделать по аналогии с предыдущим примером - атрибут order-by="dogName" заменим на order-by="dogWeight". Результат приведен ниже (, ).
Кличка | Вес | Цвет |
Тузик | 10 кг | белый с черными пятнами |
Шарик | 18 кг | рыжий с черными подпалинами |
Бобик | 2 кг | бело-серый |
Трезор | 25 кг | черный |
Таблица действительно отсортирована по столбцу "вес", но это не числовая, а строковая сортировка! Для того, чтобы браузер воспринял значения как числа, ему необходимо об этом сказать, - вместо order-by="dogWeight"
необходимо написать order-by="number(dogWeight)". Теперь мы получили правильный результат (, ).
Кличка | Вес | Цвет |
Бобик | 2 кг | бело-серый |
Тузик | 10 кг | белый с черными пятнами |
Шарик | 18 кг | рыжий с черными подпалинами |
Трезор | 25 кг | черный |
Приведем теперь пример сортировки по нескольким столбцам. Различные элементы в атрибуте order-by должны разделяться символом ";" - order-by="number(dogWeight); dogName" (, ). Таблица приведена ниже.
Кличка | Вес | Цвет |
Трезор | 10 кг | черный |
Тузик | 10 кг | белый с черными пятнами |
Бобик | 18 кг | бело-серый |
Шарик | 18 кг | рыжий с черными подпалинами |
Следующий пример работает только под управлением XML-парсера версии 3. В нем строки сортируются по одному столбцу - по кличке собаки. Этот пример уже приводился выше, однако теперь мы используем новый синтаксис (, ).
Отметим разницу.
При использовании нового синтаксиса используется ссылка на другое пространство имен
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Это очень важный момент, и его никогда нельзя упускать из виду.
Кроме того, мы убрали атрибут order-by в элементе xsl:for-each
и добавили другой элемент
<xsl:sort order="ascending" select="dogName"/>
Если элемент xsl:sort
присутствует в элементе xsl:for-each, то он всегда должен стоять сразу после элемента xsl:for-each. Синтаксис элемента xsl:sort достаточно очевиден. В нем используются два атрибута: атрибут order - способ сортировки (по возрастанию или по убыванию) и атрибут select - имя поля, по которому производится сортировка. Если нам нужно отсортировать по первому элементу, как в данном примере, то вместо "dogName" можно было поставить точку - ".", для других элементов нужно указывать его имя, например "dogColor", если нам нужно отсортировать записи по цвету собаки. На самом деле атрибутов может быть пять - select, lang, data-type, order и case-order, но мы не будем здесь рассматривать все эти атрибуты, поскольку здесь мы не преследуем цель дать полное описание всех элементов, используемых в XSL, и их атрибутов.
Таблица результатов приведена ниже.
Кличка | Вес | Цвет |
Бобик | 2 кг | бело-серый |
Трезор | 25 кг | черный |
Тузик | 10 кг | белый с черными пятнами |
Шарик | 18 кг | рыжий с черными подпалинами |
Разница заключается в одной строке
<xsl:sort order="descending" select="dogName"/>
Мы изменили значение атрибут order - значение ascending
заменено на descending.
Таблица результатов приведена ниже.
Кличка | Вес | Цвет |
Шарик | 18 кг | рыжий с черными подпалинами |
Тузик | 10 кг | белый с черными пятнами |
Трезор | 25 кг | черный |
Бобик | 2 кг | бело-серый |
Покажем теперь сортировку по нескольким полям (, ). Этот пример работает только под управлением XML-парсера версии 3.
В этом примере у нас фигурируют две строки с элементом xsl:sort.
<xsl:sort order="ascending" select="number(dogWeight)" data-type="number"/>
<xsl:sort order="ascending" select="dogName"/>
Строки вначале сортируются по весу собаки, а затем по их кличкам в алфавитном порядке. Обратите внимание - для того, чтобы сортировка выполнялась в числовой последовательности, в элемент xsl:sort мы добавили атрибут data-type. Таблица результатов приведена ниже.
Кличка | Вес | Цвет |
Волчонок | 3 кг | темно-серый |
Трезор | 10 кг | черный |
Тузик | 10 кг | белый с черными пятнами |
Бобик | 18 кг | бело-серый |
Шарик | 18 кг | рыжий с черными подпалинами |
Кличка | Вес | Цвет |
Волчонок | 3 кг | темно-серый |
Тузик | 10 кг | белый с черными пятнами |
Трезор | 10 кг | черный |
Шарик | 18 кг | рыжий с черными подпалинами |
Бобик | 18 кг | бело-серый |