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

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. Если процессор такой возможности не обеспечивает, вместо порядковых выводятся количественные числительные.

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