Speak.Me Учить иностранные слова

XSL: сортировка узлов, инструкция xsl:sort

По умолчанию узлы обрабатываются и помещаются в конечное дерево в порядке просмотра исходного дерева. Инструкция 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 таких ограничений нет.

Синтаксис:

Атрибуты:

  • 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 зависит от языка.

Если ключи нескольких узлов совпадают, они могут быть в дальнейшем отсортированы вторичным и так далее ключами. Если же этого не сделать, то такие узлы будут расположены относительно друг друга в том порядке, в котором они следовали в исходном дереве.