Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Функция key в паттернах
Разбирая синтаксические правила построения паттернов, мы встретились с особой формой паттерна, в котором могла использоваться функция key. Приведем еще раз эту продукцию:
[PT3] IdKeyPattern ::= 'id' '(' Literal ')'
| 'key' '(' Literal ',' Literal ')'
Функция key( key-name , key-value )в паттерне будет соответствовать узлам, значение ключа key-nameкоторых равняется или принадлежит объекту key-value. Это позволяет использовать возможности ключей при проверке узлов на соответствие образцу.
Предположим, что нам нужно по-особому обработать объекты, принадлежащие источнику а. Для этого мы можем создать шаблон следующего вида.
Этот шаблон будет применяться к любым узлам, имеющим ключ srcсо значением а.
Нумерация
Нумерация, несомненно, является одной из самых естественных проблем, решаемых при помощи XSLT. Задача нумерации состоит в том, чтобы, исходя из позиции обрабатываемого узла в дереве документа, вычислить по заданным критериям его порядковый номер. В качестве примера такого рода задачи можно привести вывод номеров частей, разделов и глав книги, указание номеров элементов списка или строк таблицы.
Для вычисления порядковых номеров узлов в дереве в XSLT существует несколько способов. В простых случаях для достижения цели бывает достаточно воспользоваться одним из следующих XPath-выражений.
□ Для того чтобы получить порядковый номер текущего узла в обрабатываемом множестве, можно использовать функцию position. Обратим внимание, что это будет позиция узла в обрабатываемом в данный момент множестве, а не в дереве исходящего документа.
□ Функция count(preceding-sibling::*)+1возвращает порядковый номер текущего элемента среди других элементов его родителя, иначе говоря, среди его братьев. Путь выборки preceding-sibling::*выбирает множество братских элементов, предшествующих текущему узлу, а функция countвычисляет их количество. Таким образом, значение count(preceding-sibling::*)+1будет равно 1для первого элемента (поскольку ему другие элементы не предшествуют), 2— для второго (ему предшествует один элемент) и так далее.
□ Для того чтобы учитывать при подсчете только определенные элементы, можно переписать предыдущее выражение в чуть более строгом виде. Например, выражение, считающее только элементы chapter, будет задаваться следующим образом: (preceding-sibling::chapter) +1.
□ Глубина текущего узла от корня дерева может быть вычислена выражением count(ancestor-or-self::node()). Это выражение будет возвращать 1для корневого узла, 2для элемента документа и так далее.
Вычислять выражения и выводить вычисленные значения в результирующее дерево следует, как и обычно — при помощи элемента xsl:value-of.
В более сложных ситуациях бывает необходимо подсчитывать узлы, находящиеся на разных уровнях вложенности или удовлетворяющие определенным условиям, начинать отсчет с заданной позиции в документе и использовать при вычислении номера сложные выражения. Использование XPath в таких случаях может быть очень неудобным — выражения будут слишком громоздкими и вычислять их придется в несколько этапов.
Другим, несравненно более легким и удобным способом нумерации и индексирования узлов является использование элемента xsl:number.
Элемент xsl:number
Синтаксис элемента описывается следующей конструкцией:
level="single"
| "multiple"
| "any"
count=" паттерн "
from=" паттерн "
value=" выражение "
format="{ строка }"
lang="{ токен }"
letter-value={ "alphabetic"
| "traditional" }
grouping-separator="{ символ }"
grouping-size="{ число }"/>
Элемент xsl:numberвычисляет номер узла в соответствии с заданными критериями, форматирует его и затем вставляет в результирующее дерево в виде текстового узла. То, что все это выполняется в одном элементе преобразования, имеет существенные преимущества по сравнению с использованием XPath-выражений: программа становится более простой и понятной, причем далеко не в ущерб функциональности.
К сожалению, в этом случае, как и во многих других, универсальность использования повлекла за собой семантическую сложность. Несмотря на то, что xsl:numberимеет всего девять атрибутов (причем ни один из них не является обязательным), мы посвятим их описанию значительное количество страниц. Пока же, чтобы сориентировать читателя, мы кратко перечислим назначения атрибутов xsl:number.
□ Атрибут levelуказывает, на каких уровнях дерева следует искать нумеруемые узлы.
□ Атрибут countуказывает, какие именно узлы следует считать при вычислении номера.
□ Атрибут fromуказывает, в какой части документа будет производиться нумерация.
□ Атрибут valueзадает выражения, которые следует использовать для вычисления значения номера.
□ Атрибут formatопределяет, как номер будет форматироваться в строку.
□ Атрибут langзадает языковой контекст нумерации.
□ Атрибут letter-valueопределяет параметры буквенных методов нумерации.
□ Атрибут grouping-separatorзадает символ, разделяющий группы цифр в номере.
□ Атрибут grouping-sizeопределяет количество цифр в одной группе.
Выполнение элемента xsl:numberможно условно разделить на два этапа — вычисление номера и его строковое форматирование. На этапе вычисления активными являются элементы level, count, fromи value. Форматирование производится с учетом значений атрибутов format, lang, letter-value, grouping-separatorи grouping-size. Результатом первого этапа является список номеров, который форматируется в текстовый узел на втором этапе.
Вычисление номеров
Пожалуй, самым простым для понимания (но не самым простым в использовании) способом вычисления номера является использование XPath-выражений. Этот способ практически идентичен использованию xsl:value-of, как было показано в начале этой главы. Единственным отличием xsl:numberявляется то, что после вычисления номера он сначала форматируется, а потом уже вставляется в результирующее дерево в виде текстового узла.
Результатом первого этапа форматирования при определенном атрибуте valueявляется список, состоящий из числа, полученного в результате вычисления выражения, указанного в значении этого атрибута.
В этом и нескольких следующих примерах мы будем вычислять номера в одном и том же документе, который представлен в листинге 8.31.
Читать дальшеИнтервал:
Закладка: