Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

□ Если за текущим токеном вида

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
— итеративная обработка множества узлов.

Создание узлов элементов

В четвертой главе мы уже разобрали один из способов создания в выходящем документе узлов элементов, а именно — использование литеральных элементов результата, которые в неизменном виде копируются процессором в выходящее дерево. Этот способ прост, понятен и удобен, однако есть две основные проблемы, которые он не может решить.

□ Что, если в выходящем документе требуется создать элемент с заранее неизвестным (например, вычисляемым во время выполнения) именем?

□ Как создать элемент, принадлежащий пространству имен, известному обрабатывающему процессору?

Поясним на примерах суть и той и другой проблемы.

Представим себе входящий документ вида

<element name="a">

 <element name="b"/>

</element>

который нужно преобразовать во что-нибудь наподобие

<а>

 <b/>

</а>

Совершенно очевидно, что литеральными элементами тут не обойдешься — мы не знаем заранее имена элементов выходящего документа, ибо они определяются значениями атрибутов входящего.

Представим теперь, что нам в XSLT-преобразовании необходимо сгенерировать другое XSLT-преобразование. Скажем из элемента вида

<remove element="a"/>

нужно получить шаблон

<xsl:template match="a"/>

Беда в том, что литеральные элементы не могут быть использованы для создания, скажем, элемента

xsl:template
по той причине, что любой элемент с локальной частью имени
template
, принадлежащий пространству имен XSLT будет рассматриваться процессором, как элемент самого преобразования. Очевидно, что

<xsl:template match="remove">

 <xsl:template match="{@element}"/>

</xsl:template>

будет некорректным определением. He поможет и смена префикса, ведь принадлежность пространству имен определяется не им.

Для того чтобы решить эти проблемы (главным образом, первую), XSLT предоставляет возможность создавать узлы элементов при помощи элемента

xsl:element
.

Элемент xsl:element

Синтаксическая конструкция этого элемента задается следующим образом:

<xsl:element

 name="{имя}"

 namespace="{пространство имен}

 "use-attribute-sets="имена">

 <!-- Содержимое: шаблон -->

</xsl:element>

Здесь обязательный атрибут

name
указывает имя создаваемого элемента. Этот атрибут может содержать шаблон значения, а значит, имя элемента может быть вычислено во время выполнения.

Поделиться с друзьями: