Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-08.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
422.91 Кб
Скачать

5.3.12.4. Сортировка вXslt

При преобразовании документа с помощью элементов xsl:for-eachиxsl:apply-templates, выбранные узлы по умолчанию обрабатываются в порядке про­смотра документа, который зависит от выражения, использованного в атри­бутеselectэтих элементов.

Элементы xsl:for-eachиxsl:apply-templatesмогут содержать один или несколько элементовxsl:sort, которые позволяют предварительно сорти­ровать обрабатываемое множество узлов.

Элемент xsl:sortимеет следующий синтаксис:

<xsl:sort

select = "выражение"

lang = "язык"

data-type = "text" | "number" | "имя"

order = "ascending" | "descending"

collation? = "URI"

stable = "yes" | "no"

case-order = "upper-first" | "lower-first"

data-type = "text" | "number" | "имя"

>

<!--

Содержимое: конструктор последовательности

-->

</xsl:sort>

Если xsl:for-eachиxsl:apply-templatesсодержат элементыxsl:sort, обработка множества узлов должна производиться не в порядке просмотра документа, а в порядке, который определяется ключами, вычис­ленными при помощиxsl:sort. Первый элементxsl:sort, присутствующий в родительском элементе, определяет первичный ключ сортировки, второй элемент – вторичный ключ, и так далее.

Элемент xsl:sortобладает атрибутомselect, значением которого является выражение, называемое также ключевым выражением. Это выражение вы­числяется для каждого узла обрабатываемого множества, преобразуется в строку и затем используется как значение ключа при сортировке. По умол­чанию значением этого атрибута является".", что означает, что в качестве значения ключа для каждого узла используется его строковое значение.

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

Элемент xsl:sortможет иметь следующие необязательные атрибуты, кото­рые указывают некоторые параметры сортировки:

Атрибут orderопределяет порядок, в котором узлы должны сортировать­ся по своим ключам. Этот атрибут может принимать только два значе­ния –"ascending", указывающее на восходящий порядок сортировки, и"descending", указывающее на нисходящий порядок (по умолчанию сортировка выполняется в восходящем порядке).

Атрибут langопределяет язык ключей сортировки (этот атрибут может иметь те же самые значения, что и атрибутxml:lang, например:"en","en-us","ru"и т. д.). Если значение этого атрибута не определено, процессор может либо определять язык исходя из параметров системы, либо сортировать строки исходя из порядка кодов символовUnicode.

Атрибут data-typeопределяет тип данных, который несут строковые значения ключей. Значение"text"(это значение по умолчанию) определяет, что ключи должны быть отсортированы в лексикографическом порядке исходя из языка, определенного атрибутомlangили парамет­рами системы. Значение"number"определяет, что ключи должны сравниваться в численном виде (если стро­ковое значение ключа не является числом, оно будет преобразовано к не-числу –NaN, и, поскольку нечисловые значения неупорядочены, соответствующий узел может появиться в отсортированном множестве где угодно). Значение"имя"тип данных, который определяется конкретным процессоромXSLT(например, сортировка дат).

Атрибут case-orderуказывает на порядок сортировки символов разных регистров. Если значение атрибута равно"upper-first", то заглавные символы должны идти первыми, если"lower-first" – первыми должны идти строчные символы. Значение этого атрибута по умолчанию зависит от процессора и языка сортировки. В большинстве случаев за­главные буквы идут первыми.

Атрибут stableзадает ("yes") или отменяет ("no") спецификацию ключа сортировки для первого сортируемого элемента. По умолчанию значение этого атрибута равно "yes".

Атрибут collationзадает ссылку на ресурс, содержащий правила сравнения строк.

Пример использования элемента xsl:sort:

Приведенный выше список

<?xml version="1.0" encoding="Windows-1251"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output

method="text"

encoding="Windows-1251"

indent="yes"

/>

<xsl:template match="text()">

<xsl:apply-templates/>

</xsl:template>

<xsl:template match="message">

<xsl:for-each select="//to">

<xsl:sort select="." order="descending"/>

<xsl:value-of select="position()"/>

<xsl:text>. </xsl:text>

<xsl:value-of select="@address"/>

<xsl:text> </xsl:text>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>.

Выходной текстовый документ будет иметь следующий вид:

1. sidorov@mail.com

2. petrov@mail.com.

Соседние файлы в папке Лекции