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

ЖАНРЫ

Технология XSLT

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

Шрифт:

XPath-выражения являются статическими компонентами языка XSLT. Выражения нельзя создавать во время выполнения преобразования, иначе говоря, функции высшего порядка (функции, результатом вычисления которых также являются функции) в XSLT отсутствуют. Нельзя сделать, например, следующее:

<!-- Создаем XPath-выражение -->

<xsl:variable name="expr" select="concat(.'page/number[', id, ']')"/>

<!-- Вычисляем динамически созданное XPath-выражение -->

<xsl:value-of select="eval($expr)"/>

В XPath отсутствует функция

eval
, которая вычисляла бы значение XPath-выражения, переданного ей в виде
строки.

Примечание

Функция

eval
присутствует в некоторых XSLT-процессорах, например в Saxon в виде расширения
saxon:evaluate
.

Контекст вычисления выражений

Как мы видели ранее, в XSLT одно и то же правило преобразования может применяться к различным частям XML-документа и в каждом случае результат будет разным — в зависимости от того, как выглядит обрабатываемый фрагмент. Подобно этому, XPath-выражения тоже вычисляются в зависимости от контекста. Контекст показывает, какой узел в данный момент обрабатывается преобразованием, какова позиция этого узла в обрабатываемом множестве, сколько всего узлов в этом множестве, какие переменные доступны и какие значения они имеют, какие функции могут быть вызваны и, наконец, какие пространства имен объявлены. Иными словами, контекст — это полное описание положения, окружения или ситуации, в которой происходит вычисление.

Если давать строгое определение в соответствии со спецификацией XPath, то контекст составляют следующие части.

□ Контекстный узел — узел, который обрабатывается в текущий момент. Контекстный узел оказывает влияние на вычисление многих выражений — например, относительные пути выборки будут отсчитываться относительно контекстного узла. В большинстве случаев контекстный узел совпадает с текущим узлом преобразования, однако во время вычисления самих XPath-выражений, они могут различаться.

□ Целое положительное число, показывающее размер контекста — количество узлов во множестве, которое обрабатывается в данный момент. Это число может быть получено функцией

last
.

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

position
. Позиция первого узла равна 1, позиция последнего — значению функции
last
.

□ Множество связанных переменных. Это множество есть множество пар вида "имя-значение", в котором имя переменной связывается со значением, присвоенным ей. Переменные не определяются в самом XPath, для этого следует использовать элемент языка XSLT

xsl:variable
. Переменные могут содержать как значения любого из четырех базовых типов XPath (булевый тип, строка, число, множество узлов), так и значения других типов. Например, в XSLT значению переменной можно присвоить результирующий фрагмент дерева, а расширения языка так и вовсе могут присваивать переменным объекты любых типов. Другое дело, что XPath-выражения в соответствии со стандартом не должны непосредственно работать другими типами объектов, кроме своих четырех базовых. Механизмы расширения XPath и XSLT будут рассматриваться в главе 10.

В отношении переменных важно понимать, что это не более чем объекты, доступ к которым можно получить по имени.

□ Библиотека функций, состоящая из множества функций, которые могут быть выполнены процессором. В XPath определяется базовая библиотека, функции которой должны быть реализованы в процессоре, однако эта библиотека может быть расширена. Например, XSLT определяет несколько дополнительных функций, которые также должны поддерживаться всеми XSLT-процессорами. Более того, в преобразованиях можно использовать и собственные функции расширения. Таким образом, библиотека

функций контекста состоит из всех функций, доступных при вычислении выражения.

□ Множество объявлений пространств имен. Это множество связывает префиксы пространств имен с уникальными идентификаторами ресурсов (URI), которые им соответствуют.

Пути выборки

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

Синтаксис путей выборки во многом похож на синтаксис путей в файловых системах — сказывается то обстоятельство, что иерархическая структура данных в XML-документах очень близка к древовидной структуре каталогов. В качестве примера сравним дерево каталогов (рис. 6.1) с таким же деревом, записанным в виде XML-документа (листинг 6.1).

Рис. 6.1. Древовидная структура каталогов

Листинг 6.1 XML-документ

<Java>

 <Doc>

<ClassGenerator/>

<SchemaProcessor/>

<XMLParser>

<images/>

</XMLParser>

 </Doc>

 <Lib>

<Servlets>

<classes/>

<doc>

<images/>

</doc>

<lib/>

<src/>

</Servlets>

 </Lib>

</Java>

В этой иерархии каталогов путь "

/
" соответствует корневому каталогу, путь "
/Java/Lib/Servlets/src
" — каталогу
src
. Путь из каталога
Java
в каталог
XMLParser
имеет вид "
Doc/XMLParser
", а путь из каталога
Lib
в каталог
images
— "
Servlets/doc/images
".

Перемещаться в системе каталогов можно не только вглубь, но также на верхние уровни при помощи пути "

..
", который осуществляет переход в родительский каталог. К примеру, для того, чтобы перейти из каталога "
/Java/Lib/Servlets/doc/images
" в каталог "
/Java/Doc/XMLParser/images
", можно воспользоваться путем "
../../../../Doc/XMLParser/images
".

Пути файловой системы, приведенные выше, в точности совпадают с путями выборки, которые мы бы использовали для обращения к соответствующим частям ХМL-документа. Путь выборки "

/
" содержит корневой узел, путь выборки "
/java/Lib/Servlets/src
" — элемент
src
, принадлежащий элементу
Servlets
, который принадлежит элементу
Lib
, который принадлежит элементу
Java
, находящемуся в корне элемента. Путь выборки "
Doc/XMLParser
" выбирает элементы
XMLParser
, находящиеся в элементах
Doc
, принадлежащих контекстному узлу.

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