По умолчанию узлы обрабатываются и помещаются в конечное дерево в порядке просмотра исходного дерева. Инструкция 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
– указывает, что ключи должны сортироваться как текст в соответствии с языком, указанным в атрибутеlang
number
– указывает, что ключи сортировки должны быть преобразованы в числа, а затем упорядочены в соответствии со своим числовым значением. При этом строка преобразуется в число по следующим правилам: строка, начинающаяся с числа, после которого идет пробельный символ, преобразовывается в это число; все остальное содержимое этой строки не учитывается. Перед числом также может стоять пробельный символ и знак минус. Все остальные строки преобразуются в NaN (не число), а узлы, содержащие такое значение, вообще не будут отсортированы (т.е. будут вставлены в произвольном порядке)другой_тип_данных
– в целях расширяемости XSLT позволяет указывать любой другой тип данных (введенный пользователем). Сортировка в этом случае полностью зависит от процессора.
case-order
– определяет порядок сортировки символов разных регистров. Может принимать два значения:upper-first
– указывает, что сначала должны идти символы в верхнем регистре (заглавные буквы),lower-first
– указывает, что сначала должны идти символы в нижнем регистре (строчные буквы). При этом, поскольку верхний и нижний регистр различим только для букв, данный атрибут может быть применен, только если атрибутdata-type
имеет значениеtext
. Алфавитный порядок (восходящий или нисходящий) имеет приоритетное значение: ключи сначала располагаются в алфавитном порядке и лишь потом в соответствии со значением атрибутаcase-order
. Нарушить алфавитный порядок и расположить сначала все заглавные буквы (А-Я), а потом все строчные (а-я), данный атрибут не может. Значение по умолчанию атрибутаcase-order
зависит от языка.
Если ключи нескольких узлов совпадают, они могут быть в дальнейшем отсортированы вторичным и так далее ключами. Если же этого не сделать, то такие узлы будут расположены относительно друг друга в том порядке, в котором они следовали в исходном дереве.