Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Дело в том, что структуры XML-документов (даже принадлежащих одной логической схеме) могут быть настолько разнообразны, что создание императивной программы, которая выполняла бы их преобразование, является очень сложной задачей. Возможность включения или исключения тех или иных элементов, наличие или отсутствие атрибутов, да и неопределенность самой структуры документа в конечном итоге приводят к экспоненциальному увеличению количества операторов ветвления, циклов и так далее. Программа становится большой, сложной и малопонятной.
В то же время само преобразование может быть очень простым. Не понимая, что нужно сделать, чтобы преобразовать документ целиком , тем не менее, можно хорошо понимать, как следует обработать каждую из его частей.
Вследствие этого, язык XSLT был создан декларативным: вместо того, чтобы определять последовательность действий, программа в XSLT декларирует правила преобразования. Каждое из этих правил может в свою очередь вызывать другие правила, таким образом обеспечивая обработку документов сколь угодно сложной структуры.
Определение шаблонного правила
Элемент xsl:template
Синтаксис этого элемента приведен ниже:
match=" пaттерн "
name=" имя "
priority=" число "
mode=" имя ">
Элемент верхнего уровня xsl:template
определяет в преобразовании шаблонное правило , или просто шаблон . Элемент xsl:template
имеет всего четыре атрибута, смысл которых мы кратко опишем ниже.
Атрибут match
задает паттерн — образец узлов дерева, для преобразования которых следует применять этот шаблон.
В этом правиле атрибут match
говорит о том, что оно должно использоваться для обработки элементов bold
— в данном случае они будут заменяться на элементы b
. Шаблоны, в которых определен атрибут match
, вызываются при помощи инструкции xsl:apply-templates
.
Шаблон также может иметь имя, определяемое атрибутом name
. Шаблон, в котором задано имя, называется именованным шаблоном. Именованные шаблоны могут вызываться вне зависимости от текущего контекста, и даже вести себя как функции — принимать на вход параметры и возвращать некоторые значения.
В отличие от предыдущего примера, это правило не будет обрабатывать какие-либо определенные узлы. Вызвать его можно будет только по имени посредством элемента xsl:call-template
.
При определении шаблона нужно обязательно указать хотя бы один из атрибутов match
или name
, причем эти атрибуты могут присутствовать в xsl:template
одновременно.
Атрибут mode
определяет режим данного шаблонного правила. Режимы позволяют задавать различные преобразования для одних и тех же частей документа (о них мы поговорим позже).
Атрибут priority
используется для определения значения, которое называется приоритетом шаблонного правила. Это значение используется для разрешения конфликтов шаблонов в случае, когда один узел может быть обработан различными правилами.
Атрибуты шаблонного правила не влияют на выполнение его содержимого. Они используются элементами xsl:apply-templates
и xsl:call-template
при выборе шаблонов. Правила, которые были импортированы в преобразование, вызываются элементом xsl:apply-imports
.
Вызов шаблонных правил
Рассмотрим следующий простой пример.
text
Попробуем написать пару шаблонов, которые будут изменять имена элементов para
и bold
на p
и b
соответственно. Сначала напишем преобразование для bold
:
В этом правиле создается элемент b
, в который включается текстовое значение текущего узла (то есть, обрабатываемого элемента bold
). Применив это преобразование к входящему документу, мы получим следующий результат:
text
Как говорят математики, что и требовалось. Попробуем проделать тот же трюк с элементом para
и создадим преобразование, включающее оба правила.
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
На этот раз вместо ожидаемого результата вида
text
text
Попробуем ответить на три вопроса: кто виноват, что делать и куда делся элемент b
.
Для ответа на вопрос, куда делся элемент b
, пожалуй, необходимо будет пояснить, что же именно происходит при преобразовании этого документа. Последовательно рассмотрим стадии этого процесса.
□ Процессор начинает обработку с корневого узла дерева. Он выбирает шаблон, соответствующий этому узлу. В нашем преобразовании такого шаблона нет, значит, процессор применит к корню шаблонное правило, определенное по умолчанию ( см. раздел "Встроенные шаблоны" данной главы ).
□ По умолчанию шаблонное правило корневого узла обрабатывает все дочерние узлы. В нашем документе единственным дочерним узлом корня будет элемент para
.
□ Для элемента para
в нашем преобразовании задан шаблон, который и будет применен к этому элементу.
□ В соответствии с этим шаблоном, процессор создаст элемент p
и включит в него текстовое значение выражения " .
". Как мы знаем, выражение " .
" является сокращенной формой выражения " self::node()
", которое возвратит текущий узел. Таким образом, элемент вычислит и возвратит строковое значение текущего узла, то есть узла para
. Строковым значением элемента является конкатенация всех его текстовых потомков. Единственным текстовым потомком нашего para является текстовый узел со значением " text
" и вот он-то и выводится между открывающим и закрывающим тегами созданного элемента p
.
Таким образом, элемент b
"потерялся" потому, что шаблон для bold
просто не вызывался. Виноваты, естественно, мы сами, поскольку не включили его вызов. Осталось только разобраться, как можно вызвать шаблон для обработки элемента bold
.
Ответ на этот вопрос предельно прост — для вызова неименованных шаблонных правил В XSLT используется элемент xsl:apply-templates
.
Элемент xsl:apply-templates
Синтаксис этого элемента выглядит следующим образом:
select=" выражение "
mode=" режим ">
Элемент xsl:apply-templates
применяет шаблонные правила к узлам, которые возвращаются выражением, указанным в атрибуте select
. Если атрибут select
опущен, то xsl:apply-templates
применяет шаблонные правила ко всем дочерним узлам текущего узла, то есть
равносильно
Атрибут mode
используется для указания режима, в котором должны применяться шаблоны — мы поговорим о различных режимах чуть позже.
Интервал:
Закладка: