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

5.3.15. Нумерация в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 (если они заданы). После преобразования полученная строка подставляется в конечное дерево.

Пример использования атрибута value в элементе xsl:number:

Пусть задано следующее шаблонное правило для вывода тем сообщений в документе message.xml:

<xsl:template match="subject" mode="value">

<p>

<xsl:number value="position()"/>

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

<xsl:value-of select="."/>

</p>

</xsl:template>.

Тогда при выполнении шаблонного правила:

<xsl:template match="/">

<xsl:apply-templates

select="//header" mode="value"/>

</xsl:template>

будет выведено:

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