- •Лабораторная работа 4-03
- •3.1.2. Пространство имен xslt
- •3.1.3. Корневые элементы и элементы верхнего уровня документаXslt
- •3.1.4. Условное включение элемента
- •3.1.5. Модульная структура преобразованийXslt
- •3.1.4. Совместное использование преобразований и документов xml
- •3.2. Управление выводом в xslt
- •3.2.1. Элементxsl:output
- •3.2.2. Метод вывода "xml"
- •3.2.3. Метод вывода "xhtml"
- •3.2.4. Метод вывода "html"
- •3.2.5. Метод вывода "text"
- •3.3.Язык xslt
- •3.3.1. Образцы и шаблоны
- •3.3.2. Объявлениешаблона
- •3.3.3. Вызов неименованных правил шаблона
- •3.3.4. Создание узлов элементов и атрибутов вXslt
- •3.3.4.1. Элемент xsl:element
- •3.3.4.2. Элементxsl:attribute
- •3.3.4.3. Элементxsl:attribute-set
- •3.3.5. Создание текстовых узлов вXslt
- •3.3.5.1. Элементxsl:text
- •3.3.5.2. Элементxsl:value-of
- •3.3.5.3. Встроенные правила шаблона
- •3.3.5.4. Обработка пробельных символов
- •3.3.6. Создание узлов документа, комментариев, инструкций по обработке и пространства имен в xslt
- •3.3.6.1. Элемент xsl:document
- •3.3.6.2. Элементxsl:result-document
- •3.3.6.3. Элементxsl:comment
- •3.3.6.4. Элемент xsl:processing-instruction
- •3.3.6.5. Элементxsl:namespace
- •3.3.7. Копирование узлов вXslt
- •3.3.7.1. Элементxsl:copy
- •3.3.7.2. Элементxsl:copy-of
- •3.3.7.3. Элементxsl:sequence
- •3.3.8. Условная и циклическая обработка вXslt
- •3.3.8.1. Элементxsl:if
- •3.3.8.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •3.3.8.3. Элементxsl:for-each
- •3.3.9. Сортировка в xslt
- •3.3.10. Нумерация в xslt
- •3.3.11. Переменные и параметры в xslt
- •3.3.11.1. Переменные в xslt
- •3.3.11.2. Вызов именованных правил шаблона
- •3.3.11.3. Параметры в xslt
- •3.4. Выполнение преобразований документов в xmlSpy
- •3.4.1. Создание документа xslt
- •3.4.2. Выполнение преобразования xslt
- •4. Порядок выполнения работы
- •Вариант 5-01
- •Вариант 5-02
- •Вариант 5-03
- •Вариант 5-04
- •Вариант 5-05
- •Вариант 5-06
- •Вариант 5-07
- •Вариант 5-08
- •Вариант 5-09
- •Вариант 5-10
- •Вариант 5-11
- •Вариант 5-12
- •Вариант 5-13
- •Вариант 5-14
- •Вариант 5-15
- •Вариант 5-16
- •Вариант 5-17
- •Вариант 5-18
- •Вариант 5-19
- •Вариант 5-20
- •Вариант 5-21
- •Вариант 5-22
- •Вариант 5-23
- •Вариант 5-24
- •Вариант 5-25
- •Вариант 5-26
- •Вариант 5-27
- •Вариант 5-28
- •Вариант 5-29
- •Вариант 5-30
- •5. Содержание отчета
- •6. Вопросы для самоконтроля
3.3.10. Нумерация в xslt
Задача нумерации состоит в том, чтобы, исходя из позиции обрабатываемого узла в дереве документа, вычислить по заданным критериям его порядковый номер. В качестве примера такого рода задачи можно привести вывод номеров частей, разделов и глав книги, указание номеров элементов списка или строк таблицы.
Для вычисления порядковых номеров узлов в дереве в XSLT существует несколько способов. В простых случаях для достижения цели бывает достаточно воспользоваться одним из следующих выражений XPath:
Для того чтобы получить порядковый номер текущего узла в обрабатываемом множестве, можно использовать функцию position.
Функция count(preceding-sibling::*)+lвозвращает порядковый номер (начинаяc1) текущего элемента среди других элементов его родителя (путь выборкиpreceding-sibling::*выбирает множество братских элементов, предшествующих текущему узлу, а функцияcountвычисляет их количество);
Для того чтобы учитывать при подсчете только определенные элементы, можно переписать предыдущее выражение в чуть более строгом виде (например, выражение, считающее только элементы chapter, будет задаваться следующим образом:(preceding-sibling::header)+1);
Глубина текущего узла от корня дерева может быть вычислена с помощью выражения count(ancestor-or-self::node())(это выражение будет возвращать1для корневого узла,2для элемента документа и так далее).
Вычисление выражений и вывод вычисленных значений в результирующее дерево выполняется при помощи элемента xsl:value-of, например:
<xsl:value-of
select="count(preceding-sibling::header)+1"/>.
В более сложных ситуациях бывает необходимо подсчитывать узлы, находящиеся на разных уровнях вложенности или удовлетворяющие определенным условиям, начинать отсчет с заданной позиции в документе и использовать при вычислении номера сложные выражения. Использование XPathв таких случаях может быть очень неудобным, поскольку выражения получаются слишком громоздкими и вычислять их приходится в несколько этапов.
Другим, более легким и удобным способом нумерации и индексирования узлов является использование элемента xsl:number. Этот элемент имеет следующий синтаксис:
<xsl:number
value="выражение"
select="выражение"
level="single" | "multiple" | "any"
count="выражение"
from="выражение"
format="строка"
lang="имя"
letter-value="alphabetic" | "traditional"
ordinal="строка"
grouping-separator="символ"
grouping-size="число"
/>
Элемент xsl:numberвычисляет номер узла в соответствии с заданными критериями, форматирует его и затем вставляет в результирующее дерево в виде текстового узла. Ни один из атрибутов этого элемента не является обязательным.
Атрибут valueсодержит выражение, которое обрабатывается, а полученный объект преобразуется в число, как при вызове функцииXPathnumber(). Затем это число округляется до целого и преобразуется в строку с учетом атрибутовformat,lang,letter-value,grouping-separatorиgrouping-size (если они заданы). После преобразования полученная строка подставляется в конечное дерево.
Атрибуты level,countиfromпоказывают, как будет нумероваться текущий узел.
Атрибут countсодержит образец, которому должны удовлетворять нумеруемые узлы. Узлы, не соответствующие этому образцу, просто не будут приниматься в расчет. Значением этого атрибута по умолчанию является образец, выбирающий узлы с тем же типом и именем, что и у текущего узла (если, у него есть имя).
Атрибут fromсодержит образец, который определяет так называемую область нумерации, или область подсчета. При вычислении номера будут приниматься во внимание только те нумеруемые узлы, которые принадлежат этой области. По умолчанию областью подсчета является весь документ.
Атрибут levelимеет три варианта значений:single,multipleиany, значением по умолчанию являетсяsingle. Процедура вычисления номеров существенным образом зависит от того, какой из этих вариантов используется: при методеsingleсчитаются элементы на одном уровне, при методеmultiple– на нескольких уровнях и при методеany– на любых уровнях дерева.
Значение строки формата в атрибуте formatможет состоять из имеющих специальное значение алфавитно-цифровых символов1,A,a,Iиi, а также из любых других символов. Символ1обозначает нумерацию арабскими буквами, символыAиa– нумерацию большими и маленькими латинскими буквами, а символыIиi– нумерацию большими и маленькими римскими цифрами. Все остальные символы передаются в выводимую строку без изменения.
Для нумерации большими и малыми русскими буквами необходимо задавать алфавитно-цифровой символ в виде ссылок на сущности: "&#х410;" (русская заглавная буква "A") и "&#х430;" (русская строчная буква "а").
Атрибут letter-valueустраняет неясности в последовательностях нумерации, использующих буквы. Во многих языках обычно используются две основные последовательности нумерации, использующие буквы. В одной из них нумерация производится буквенными значениями в алфавитном порядке, в другой же числовое значение каждому пункту назначается по-другому, так как это принято для данного языка. В английском языке это будет соответствовать последовательностям нумерации, задаваемым лексемами форматированияaиi. В некоторых языках первый член обеих последовательностей одинаков, а потому одной лексемы форматирования будет недостаточно. Значение"alphabetic"указывает алфавитную последовательность, значение"traditional"– альтернативную. Если атрибутletter-valueне указан, порядок разрешения любых неоднозначностей определяется реализацией. Этим атрибутом надо пользоваться осторожно, поскольку в разных процессорах он реализуется по-разному.
При использовании цифровых форматов нумерации (иными словами, строк вида 1,01,001и так далее) цифры в номере можно разделить на группы, получив, например, такие номера как "2.00.00" из20000или "0-0-0-2" из2. Для этой цели вxsl:numberиспользуется пара атрибутовgrouping-separatorиgrouping-size.
Атрибут grouping-separatorзадает символ, который следует использовать для разбивки номера на группы цифр, в то время какgrouping-sizeуказывает размер группы. Эти атрибуты всегда должны быть вместе: если хотя бы один из них опущен, второй просто игнорируется.
Атрибут ordinalзадает строку, которая будет использоваться как окончания в порядковых числительных, например, для английского языка1st,2nd,3rd,4th,…. Допустимые окончания порядковых задаются в значении атрибута в виде списка, элементы которого отделяются друг от друга пробелами, причем каждый элемент начинается с символа "~", например, "~ый ~ой ~ий ~ая~ое ~ые". Реализация процессора XSLT может обеспечивать правильную подстановку окончаний порядковых числительных с учетом значений атрибутовlangиformat. Если процессор такой возможности не обеспечивает, вместо порядковых выводятся количественные числительные.
