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