10 Сортировка
<xsl:sort
select =
string-expression
lang = { nmtoken
}
data-type = { "text" | "number" |
qname-but-not-ncname }
order = { "ascending" |
"descending" }
case-order = { "upper-first" | "lower-first"
} />
Сортировка задается с помощью элементов xsl:sort
, данных как непосредственный потомок элемента xsl:apply-templates
или xsl:for-each
. Первый непосредственный потомок xsl:sort
задает первичный ключ сортировки, второй непосредственный потомок xsl:sort
задает вторичный ключ сортировки, и так далее. Если элемент xsl:apply-templates
или xsl:for-each
имеет одного или несколько непосредственных потомков xsl:sort
, то вместо того чтобы обрабатывать выбранные узлы в том порядке как они следуют в документе, сперва производится их упорядочение в соответствии с заданными ключами сортировки, и лишь затем они обрабатываются в полученном порядке. При использовании в xsl:for-each
элементы xsl:sort
должны ставиться в начале. Если обрабатывается шаблон из xsl:apply-templates
и xsl:for-each
, то в качестве текущего набора узлов берется полный отсортированный список обрабатываемых узлов.
xsl:sort
имеет атрибут select
, значением которого является выражение. Указанное выражение вычисляется для каждого узла, подлежащего обработке. При этом данный узел используется в качестве текущего узла, а полный неупорядоченный список узлов, подлежащих обработке, выступает в роли текущего набора узлов. Полученный после вычисления объект преобразуется в строку как при вызове функции string. Данная строка используется как ключ сортировки для этого узла. По умолчанию атрибут select
имеет значение .
, которое приводит к тому, что в качестве ключа сортировки используется строковое значение текущего узла.
Полученная строка используется как ключ сортировки для данного узла. Ниже приведены необязательные атрибуты элемента xsl:sort
, управляющие упорядочением списка ключей сортировки, значения всех этих атрибутов рассматриваются как шаблон значения атрибута.
-
order
определяет, следует ли сортировать строки в направлении к предкам или потомкам. ascending
определяет порядок в направлении к предкам. descending
определяет порядок сортировки в направлении к потомкам. По умолчанию подразумевается ascending
-
lang
задает язык для ключей сортировки. Атрибут имеет тот же самый диапазон значений, что и xml:lang
[XML]. Если значение lang
не указано, язык должен определяться из системного окружения.
-
data-type
определяет тип данных для данных строк, разрешены следующие значения:
-
text
указывает, что ключи сортировки должны быть упорядочены лексически в соответствии с культурными особенностями языка, указанного в атрибуте lang
-
number
указывает что ключи сортировки должны быть преобразованы в числа, а затем упорядочены в соответствии со своим числовым значением, ключ сортировки преобразуется в число как при вызове функции number, атрибут lang
игнорируется
-
QName с префиксом преобразуется в расширенное имя как описано в главе [2.4 Полные имена]. Расширенное имя идентифицирует тип данных. Данный документ не конкретизирует действия, предпринимаемые в этом случае.
Значение по умолчанию - text
.
Замечание: Рабочая группа XSL планирует, что будущие версии XSLT будут использовать схемы XML для определения других значений для этого атрибута.
-
case-order
имеет значение upper-first
или lower-first
. Данный атрибут используется когда есть data-type="text"
и указано что заглавные буквы должны ставиться прежде прописных, либо, соответственно, наоборот. Например, если есть lang="en"
, то последовательность A a B b
получается после сортировки с case-order="upper-first"
, а a A b B
- после case-order="lower-first"
. Значение по умолчанию зависит от языка.
Замечание: Два разных XSLT процессора, соответствующих спецификации, могут выполнять сортировку не совсем одинаково. Некоторые из XSLT процессоров могут не поддерживать некоторые языки. Более того, для любого конкретного языка может варьироваться сортировка, которая не была задана атрибутом xsl:sort
. Например, делается ли в японском языке сперва сортировка Hiragana или Katakana. В будущих версиях XSLT могут появиться дополнительные атрибуты, дающие контроль над такими вариациями. Для этой цели реализация в xsl:sort
может использовать атрибуты, привязанные к специальным пространствам имен.
Замечание: Рекомендуется чтобы разработчики обращались к [UNICODE TR10] за информацией по интернациональной сортировке.
Сортировка должна быть постоянной: в отсортированном списке узлов любое подмножество, имеющее ключи сортировки, дающие при сравнении равенство, должно быть выстроено в том же порядке, как и в исходном документе.
К примеру, предположим, что база данных служащих имеет формат
<employees>
<employee>
<name>
<given>James</given>
<family>Clark</family>
</name>
...
</employee>
</employees>
в таком случае список служащих можно отсортировать по имени с помощью:
<xsl:template match="employees">
<ul>
<xsl:apply-templates select="employee">
<xsl:sort select="name/family"/>
<xsl:sort select="name/given"/>
</xsl:apply-templates>
</ul>
</xsl:template>
<xsl:template match="employee">
<li>
<xsl:value-of select="name/given"/>
<xsl:text> </xsl:text>
<xsl:value-of select="name/family"/>
</li>
</xsl:template>
Назад |
Содержание |
Вперед