По умолчанию узлы обрабатываются и помещаются в конечное дерево в порядке просмотра исходного дерева. Инструкция xsl:sort позволяет изменить этот порядок, выполнив сортировку узлов по заданным критериям.
Сортировка может выполняться только внутри элементов xsl:apply-templates или xsl:for-each. При этом элементы xsl:apply-templates и xsl:for-each могут содержать как одну, так и несколько инструкций xsl:sort. В последнем случае первая инструкция xsl:sort будет задавать первичный ключ сортировки, вторая — вторичный ключ сортировки, и так далее. Если сортировка применяется внутри элемента xsl:for-each, то инструкция xsl:sort должна стоять в самом его начале (т.е. быть первой инструкцией). Для элемента xsl:apply-templates таких ограничений нет.
Синтаксис:
1 2 3 4 5 6 | <xsl:sort select = "XPath" lang = "строка" data-type = "text|number|строка" order = "ascending|descending" case-order = "upper-first|lower-first" /> |
Атрибуты:
select– позволяет определить, по какому значению сортировать узлы, т.е. задает ключ сортировки. Узлы можно отсортировать, например, по их собственному строковому (текстовому) значению, по строковому значению одного из потомков (или даже предков) и по значению атрибутов как собственных, так и атрибутов потомков/предков. Конкретный вариант и позволяет выбрать атрибутselect. Его значением является выражение на языке XPath. Оно вычисляется для каждого сортируемого узла, при этом текущим узлом для данного выражения будет сортируемый узел. Далее результат выражения преобразуется в строку, которая и будет являться ключом сортировки для данного узла. По умолчанию атрибутselectимеет значение «.«, что означает, что в качестве значения ключа сортировки для каждого узла используется его строковое значение.lang– определяет язык ключей сортировки. В связи с тем, что в разных языках буквы в алфавите могут располагаться в разном порядке, это необходимо учитывать при сортировке. Атрибутlangможет принимать те же значения, что и атрибутxml:lang(например,en,en-US,ruи т.д.). Если атрибутlangне указан, его значение определяется исходя из параметров системы.order– позволяет задать восходящий или нисходящий порядок сортировки. Его значениеascendingуказывает на восходящий порядок сортировки, аdescendingна нисходящий. Значением по умолчанию являетсяascending, то есть восходящий порядок сортировки.data-type– определяет тип данных для строковых значений ключей. Возможно три варианта его значения (значением по умолчанию являетсяtext):text– указывает, что ключи должны сортироваться как текст в соответствии с языком, указанным в атрибутеlangnumber– указывает, что ключи сортировки должны быть преобразованы в числа, а затем упорядочены в соответствии со своим числовым значением. При этом строка преобразуется в число по следующим правилам: строка, начинающаяся с числа, после которого идет пробельный символ, преобразовывается в это число; все остальное содержимое этой строки не учитывается. Перед числом также может стоять пробельный символ и знак минус. Все остальные строки преобразуются в NaN (не число), а узлы, содержащие такое значение, вообще не будут отсортированы (т.е. будут вставлены в произвольном порядке)другой_тип_данных– в целях расширяемости XSLT позволяет указывать любой другой тип данных (введенный пользователем). Сортировка в этом случае полностью зависит от процессора.
case-order– определяет порядок сортировки символов разных регистров. Может принимать два значения:upper-first– указывает, что сначала должны идти символы в верхнем регистре (заглавные буквы),lower-first– указывает, что сначала должны идти символы в нижнем регистре (строчные буквы). При этом, поскольку верхний и нижний регистр различим только для букв, данный атрибут может быть применен, только если атрибутdata-typeимеет значениеtext. Алфавитный порядок (восходящий или нисходящий) имеет приоритетное значение: ключи сначала располагаются в алфавитном порядке и лишь потом в соответствии со значением атрибутаcase-order. Нарушить алфавитный порядок и расположить сначала все заглавные буквы (А-Я), а потом все строчные (а-я), данный атрибут не может. Значение по умолчанию атрибутаcase-orderзависит от языка.
Если ключи нескольких узлов совпадают, они могут быть в дальнейшем отсортированы вторичным и так далее ключами. Если же этого не сделать, то такие узлы будут расположены относительно друг друга в том порядке, в котором они следовали в исходном дереве.

