Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Примером токенов являются операторы, которым соответствуют продукции Operator
и OperatorName
:
[XP33] OperatorName ::= 'and' | 'or' | 'mod* | 'div'
[XP32] Operator ::= OperatorName
| MultiplyOperator
| '/' | '//' | '|' | '+' | '-'
| '=' | '!=' | '<' | '>' | '<=' | '>='
Продукция самого токена выражения имеет вид:
[ХР28] ExprToken ::= '(' | ')' | '[' | ']'
| ' . ' | ' .. ' | '@' | ' | ':: '
| NameTest
| NodeType
| Operator
| FunctionName
| AxisName
| Literal
| Number
| VariableReference
При разборе XPath-выражения оно сначала разбивается на отдельные токены, а затем из них организуются более сложные структуры. При разбивке выражения на отдельные токены, следует всегда выбирать токен с самым длинным строковым представлением.
Помимо этого, для того чтобы грамматика XPath-выражений была однозначной, в спецификации языка приводятся следующие правила разбора.
□ Если текущему токену предшествует другой токен, причем этот предшествующий токен не является символом @
, ::
, (
, [
или нетерминалом Operator
, то текущий токен, являющийся символом *
, должен восприниматься как знак умножения, а токен, являющийся NCName
, — как нетерминал OperatorName
.
□ Если за текущим токеном вида NCName
следует открывающая круглая скобка (символ " (
"), токен должен восприниматься или как имя функции ( FunctionName
), или как тип узла ( NodeType
).
□ Если за текущим токеном вида NCName
следуют символы " ::
", токен должен восприниматься как имя оси навигации ( AxisName
).
□ Если ничего из вышеперечисленного не выполняется, токен не должен восприниматься, как MultiplyOperator
, OperatorName
, NodeType
, FunctionName
или AxisName
.
Мы привели эти правила в точности так, как они описаны в спецификации языка XPath. Их довольно непросто понять в такой формулировке, поэтому мы попытаемся объяснить их другими словами.
□ Символ *
является знаком умножения ( MultiplyOperator
) тогда и только тогда, когда ему предшествует токен, но этот токен не является токеном @
, ::
, (
, [
или Operator
.
□ Токен NCName
представляет имя оператора ( OperatorName
) тогда и только тогда, когда ему предшествует токен, но этот токен не является токеном ::
, (
, [
или Operator
.
□ Токен NCName
является именем функции ( FunctionName
) или типом узла ( NodeType
) тогда и только тогда, когда за ним следует символ " (
".
□ Токен NCName
является именем оси навигации ( AxisName
) тогда и только тогда, когда за ним следуют символы " ::
".
Глава 7
Основные элементы XSLT
Основные и дополнительные элементы
Все элементы XSLT можно разделить на две группы: элементы основные и элементы дополнительные. Это разделение очень условно, ничего подобного в спецификации языка XSLT нет, однако, мы будем им пользоваться, считая основными элементами те элементы XSLT, которые непосредственно отвечают за создание узлов выходящего дерева или обеспечивают контроль над этим процессом. К дополнительным элементам мы будем относить все остальные элементы XSLT.
Таким образом, множество основных элементов будет включать в себя следующее:
□ xsl:element
— создание в выходящем дереве узла элемента;
□ xsl:attribute
— создание в выходящем дереве узла атрибута;
□ xsl:attribute-set
— определение именованного набора атрибутов;
□ xsl:text
— создание текстового узла;
□ xsl:value-of
— создание текстового узла по результатам вычисления выражения;
□ xsl:comment
— создание узла комментария;
□ xsl:processing-instruction
— создание узла инструкции по обработке;
□ xsl:copy
— копирование текущего узла вместе с его узлами пространств имен;
□ x sl:copy-of
— копирование результата вычисления выражения;
□ xsl:if
— условная обработка;
□ xsl:choose
, xsl:when
и xsl:otherwise
— выбор одной из нескольких альтернатив согласно некоторым условиям;
□ xsl:for-each
— итеративная обработка множества узлов.
Создание узлов элементов
В четвертой главе мы уже разобрали один из способов создания в выходящем документе узлов элементов, а именно — использование литеральных элементов результата, которые в неизменном виде копируются процессором в выходящее дерево. Этот способ прост, понятен и удобен, однако есть две основные проблемы, которые он не может решить.
□ Что, если в выходящем документе требуется создать элемент с заранее неизвестным (например, вычисляемым во время выполнения) именем?
□ Как создать элемент, принадлежащий пространству имен, известному обрабатывающему процессору?
Поясним на примерах суть и той и другой проблемы.
Представим себе входящий документ вида
который нужно преобразовать во что-нибудь наподобие
<���а>
</а>
Совершенно очевидно, что литеральными элементами тут не обойдешься — мы не знаем заранее имена элементов выходящего документа, ибо они определяются значениями атрибутов входящего.
Представим теперь, что нам в XSLT-преобразовании необходимо сгенерировать другое XSLT-преобразование. Скажем из элемента вида
нужно получить шаблон
Беда в том, что литеральные элементы не могут быть использованы для создания, скажем, элемента xsl:template
по той причине, что любой элемент с локальной частью имени template
, принадлежащий пространству имен XSLT будет рассматриваться процессором, как элемент самого преобразования. Очевидно, что
будет некорректным определением. He поможет и смена префикса, ведь принадлежность пространству имен определяется не им.
Для того чтобы решить эти проблемы (главным образом, первую), XSLT предоставляет возможность создавать узлы элементов при помощи элемента xsl:element
.
Элемент xsl:element
Синтаксическая конструкция этого элемента задается следующим образом:
name="{ имя }"
namespace="{ пространство имен }
"use-attribute-sets=" имена ">
Здесь обязательный атрибут name
указывает имя создаваемого элемента. Этот атрибут может содержать шаблон значения, а значит, имя элемента может быть вычислено во время выполнения.
Атрибут namespace
указывает URI пространства имен создаваемого элемента. Точно так же, как и name, этот атрибут может содержать шаблон значения, что позволяет вычислять пространство имен создаваемого элемента при помощи выражений.
Атрибут use-attribute-sets
перечисляет имена наборов атрибутов, которые должны быть включены в создаваемый элемент.
Содержимым xsl:element
является шаблон, который выполняется процессором и затем включается в создаваемый элемент.
Интервал:
Закладка: