
- •Лекция 4-08
- •5.3.9. Создание текстовых узлов вXslt
- •5.3.9.1. Элементxsl:text
- •5.3.9.2. Элементxsl:value-of
- •5.3.9.3. Встроенные правила шаблона
- •1. Поздравление
- •2. Напоминание
- •5.3.9.4. Обработка пробельных символов
- •5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен вXslt
- •5.3.10.1. Элемент xsl:document
- •5.3.10.2. Элементxsl:result-document
- •5.3.10.3. Элементxsl:comment
- •5.3.10.4. Элемент xsl:processing-instruction
- •5.3.10.5. Элементxsl:namespace
- •5.3.11. Копирование узлов вXslt
- •5.3.11.1. Элементxsl:copy
- •5.3.11.2. Элементxsl:copy-of
- •5.3.11.3. Элементxsl:sequence
- •5.3.12. Условная и циклическая обработка вXslt
- •5.3.12.1. Элементxsl:if
- •5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •5.3.12.3. Элементxsl:for-each
- •5.3.12.4. Сортировка вXslt
- •5.3.13. Сообщения процессораXslt
- •5.3.14. Псевдонимы пространства имен вXslt
- •5.3.15. Нумерация вXslt
- •3. Поздравление
- •1. Поздравление
- •1. Поздравление
- •01). Поздравление
- •0:00:00:00:01)Поздравление
- •5.3.16. Форматирование чисел в xslt
- •5.3.17. Использование ключей вXslt
- •5.3.18. Переменные, параметры и функции вXslt
- •5.3.18.1. Переменные в xslt
- •5.3.18.2. Вызов именованных правил шаблона
- •5.3.18.3. Параметры в xslt
- •5.3.18.4. Функции стилей в xslt
- •5.3.19. Дополнительные функции xslt
- •5.3.19.1. Функцияdocument()
- •5.3.19.2. Функцияcurrent()
- •5.3.19.3. Функцияgenerate-id()
- •5.3.19.4. Функция system-property()
- •5.3.19.5. Функцияunparsed-entity-uri()
- •5.3.20 Использование расширений вXslt
- •5.3.20.1. Средства расширенияXslt
- •5.3.20.2. Инициатива exslt
- •5.3.20.3. Средства расширения в процессореMsxml
- •5.3.20.4. Средства расширения в процессореSaxon
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.