Мы привели эти правила в точности так, как они описаны в спецификации языка 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.
Синтаксическая конструкция этого элемента задается следующим образом:
name="{ имя }"
namespace="{ пространство имен }
"use-attribute-sets=" имена ">
Здесь обязательный атрибут nameуказывает имя создаваемого элемента. Этот атрибут может содержать шаблон значения, а значит, имя элемента может быть вычислено во время выполнения.
Читать дальше