Книга: Технология XSLT
Элемент xsl:sort
Разделы на этой странице:
Элемент xsl:sort
Синтаксис этого элемента определяется в XSLT как:
<xsl:sort
select = "выражение"
lang = "язык"
data-type = "text" | "number" | "имя"
order = "ascending" | "descending"
case-order = "upper-first" | "lower-first" />
В случае если xsl:for-each
и xsl:apply-templates
содержат элементы xsl:sort
, обработка множества узлов должна производиться не в порядке просмотра документа, а в порядке, который определяется ключами, вычисленными при помощи xsl:sort
. Первый элемент xsl:sort
, присутствующий в родительском элементе, определяет первичный ключ сортировки, второй элемент — вторичный ключ, и так далее.
Элемент xsl:sort
обладает атрибутом select
, значением которого является выражение, называемое также ключевым выражением. Это выражение вычисляется для каждого узла обрабатываемого множества, преобразуется в строку и затем используется как значение ключа при сортировке. По умолчанию значением этого атрибута является "."
, что означает, что в качестве значения ключа для каждого узла используется его строковое значение.
После этих вычислений узлы обрабатываемого множества сортируются по полученным строковым значениям своих ключей и обрабатываются в новом порядке. Если ключи некоторых узлов совпадают, они могут быть в дальнейшем отсортированы вторичными и так далее ключами.
Элемент xsl:sort
может иметь следующие необязательные атрибуты, которые указывают некоторые параметры сортировки.
? Атрибут order
определяет порядок, в котором узлы должны сортироваться по своим ключам. Этот атрибут может принимать только два значения — "ascending"
, указывающее на восходящий порядок сортировки, и "descending"
, указывающее на нисходящий порядок. Значением по умолчанию является "ascending"
, то есть восходящий порядок.
? Атрибут lang
определяет язык ключей сортировки. Дело в том, что в разных языках символы алфавита могут иметь различный порядок, что, соответственно, должно учитываться при сортировке. Атрибут lang
в XSLT может иметь те же самые значения, что и атрибут xml:lang
(например: "en"
, "en-us"
, "ru"
и т.д.). Если значение этого атрибута не определено, процессор может либо определять язык исходя из параметров системы, либо сортировать строки исходя из порядка кодов символов Unicode.
? Атрибут data-type
определяет тип данных, который несут строковые значения ключей. Техническая рекомендация XSLT разрешает этому атрибуту иметь следующие значения:
• "text"
— ключи должны быть отсортированы в лексикографическом порядке исходя из языка, определенного атрибутом lang
или параметрами системы;
• "number"
— ключи должны сравниваться в численном виде. Если строковое значение ключа не является числом, оно будет преобразовано к не-числу (NaN
), и, поскольку нечисловые значения неупорядочены, соответствующий узел может появиться в отсортированном множестве где угодно;
• "имя"
— в целях расширяемости XSLT также позволяет указывать в качестве типа данных произвольное имя. В этом случае реализация сортировки полностью зависит от процессора;
• значением атрибута data-type
по умолчанию является "text"
.
? Атрибут case-order
указывает на порядок сортировки символов разных регистров. Значениями этого атрибута могут быть "upper-first"
, что означает, что заглавные символы должны идти первыми, или "lower-first"
, что означает, что первыми должны быть строчные символы. К примеру, строки "ночь"
, "Улица"
, "фонарь"
, "Аптека"
, "НОЧЬ"
, "Фонарь"
при использовании case-order="upper-first"
будут иметь порядок "Аптека"
, "НОЧЬ"
, "ночь"
, "Фонарь"
, "фонарь"
, "улица"
. При использовании case-order="lower-first"
те же строки будут идти в порядке "Аптека"
, "ночь"
, "НОЧЬ"
, "фонарь"
, "Фонарь"
, "улица"
. Значение case-order
по умолчанию зависит от процессора и языка сортировки. В большинстве случаев заглавные буквы идут первыми.
Как можно видеть, элемент xsl:sort
определяет сортировку достаточно гибко, но вместе с тем не следует забывать, что эти возможности могут быть реализованы в процессорах далеко не полностью. Поэтому одна и та же сортировка может быть выполнена в разных процессорах по-разному.
Приведем простой пример сортировки имен и фамилий.
Рассмотрим пример.
Листинг 8.10. Входящий документ
<list>
<person>
<name>William</name>
<surname>Gibson</surname>
</person>
<person>
<name>William</name>
<surname>Blake</surname>
</person>
<person>
<name>John</name>
<surname>Fowles</surname>
</person>
</list>
Отсортируем этот список сначала по именам в убывающем, а затем по фамилиям в возрастающем порядке.
<xsl:template match="list">
<xsl:copy>
<xsl:for-each select="person">
<xsl:sort select="name" order="descending"/>
<xsl:sort select="surname"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
Листинг 8.12. Выходящий документ
<list>
<person>
<name>William</name>
<surname>Blake</surname>
</person>
<person>
<name>William</name>
<surname>Gibson</surname>
</person>
<person>
<name>John</name>
<surname>Fowles</surname>
</person>
</list>
К сожалению, сортировкой нельзя управлять динамически. Все атрибуты элемента xsl:sort
должны обладать фиксированными значениями.
- Элемент xsl:for-each
- Сортирующие элементы
- Инструкции XSLT
- Sort
- Элемент
- Создание свободно позиционируемых элементов
- 6.4. Рабочий лист Excel и его структурные элементы
- Использование отдельных процессоров XSLT
- Письма с элементами графики и вложениями
- Элемент STYLE
- 4.4. Логические элементы и синтез логических схем
- 4.7 Структурные элементы SAN