
- •Лекция 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.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>
будет выведено: