Алексей Валиков - Технология 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.
Читать дальшеИнтервал:
Закладка: