Если давать строгое определение в соответствии со спецификацией 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/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
, принадлежащих контекстному узлу.
Читать дальше