Оси делятся на прямые и обратные. Ось, содержащая лишь текущий узел контекста или те узлы, которые следуют за ним, называется прямой осью (forward axis). Ось, содержащая текущий узел контекста или те узлы, которые предшествуют ему, называется обратной осью (reverse axis). Таким образом, оси ancestor, ancestor-or-self, preceding и preceding-sibling являются обратными осями, а все остальные - прямыми. Поскольку ось self всегда содержит не более одного узла, то нет разницы, является ли она прямой или обратной. Положение близости (proximity position) по отношению к оси для какого-либо члена в наборе узлов определяется как положение узла в наборе, когда последний выстроен в соответствии с порядком следования узлов в документе, если ось является прямой, или в обратном порядке, если ось является обратной. Первая позиция имеет номер 1.
Для получения нового набора предикат фильтрует имеющийся набор узлов, отталкиваясь от оси. Каждый узел в исходном наборе, подлежащем фильтрации, поочередно становится узлом контекста и для него проверяется . При этом в качестве размера контекста используется количество узлов в исходном наборе, а в качестве положения в контексте берется к оси. Если для данного узла оценивается как true, то этот узел попадает во вновь создаваемый набор узлов, в противном случае узел туда не попадает.
Проверка сводится к обработке и приведению результата к булевому значению. Если результатом обработки является число, оно будет преобразовано в true, если соответствует положению узла в контексте. В противном случае оно преобразуется в false. Если же результат обработки не является числом, то он будет приведен к булевому значению как при вызове функции . Таким образом, путь адресации para[3] равнозначен para[position()=3].
для оси attribute основным типом узлов является атрибут. для оси namespace основным типом узлов является пространство имен. для остальных осей основным типом узлов является элемент.
Правило проверки узлов, соответствующее сценарию , имеет результатом true тогда и только тогда, когда тип узла (см. ) совпадает с основным типом узлов, а его совпадает с , указанным этим . Например, child::para собирает элементы para, являющиеся непосредственными потомками текущего узла контекста. Если текущий узел контекста не имеет непосредственного потомка para, то будет получен пустой набор узлов. attribute::href в текущем узле контекста выбирает атрибут href. Если текущий узел контекста не имеет атрибута href, будет получен пустой набор узлов.
в правиле для проверки узла, преобразуется в с помощью деклараций пространств имен в контексте этого выражения. Точно так же преобразуются названия типов элементов в начальных и конечных тэгах, за исключением того, что не используется пространство имен по умолчанию, декларированное с помощью xmlns: если не имеет префикса, URI пространства имен будет нулевым (таким же способом обрабатываются названия атрибутов). Если имеет префикс, для которого в контексте выражения нет соответствующей декларации пространства имен, фиксируется ошибка.
Правило проверки узлов * имеет результатом true для любого узла, если его тип соответствует основному. Например, child::* найдет все элементы, являющиеся непосредственными потомками текущего узла контекста, а attribute::* соберет все атрибуты текущего узла контекста.
Правило проверки узлов может иметь вид :*. В этом случае префикс, так же как и в случае с , преобразуется с помощью деклараций пространства имен в контексте. Если для этого префикса в контексте выражения не найдено соответствующей декларации пространства имен, фиксируется ошибка. Указанное правило проверки узла будет выдавать true для любого узла основного типа, чье имеет именно то URI пространства имен, к которому привязан указанный префикс, независимо от локальной части в названии узла.
Правило проверки узлов text() будет давать результат true для любого текстового узла. Например, child::text() будет собирать текстовые узлы, являющиеся непосредственными потомками текущего узла контекста. Точно так же, правило проверки узлов comment() будет выдавать true для любого узла комментария, а правило проверки узлов processing-instruction() - для любой инструкции обработки. Правило проверки processing-instruction() может иметь аргумент типа . В этом случае проверка будет давать true для любой инструкции проверки, чье название соответствует значению этого аргумента.
Правило проверки узлов node() будет выдавать true для любого узла, к какому бы типу он не относится.
[7] |
NodeTest |
::= |
|
|
|
|
|
| '(' ')' |
|
|
|
|
| 'processing-instruction' '(' ')' |
|
Пути адресации
Хотя пути адресации (location path) и не являются самой главной грамматической конструкцией языка ( - это частный случай ), они имеют самое большое значение, а потому будут описаны в первую очередь.
Каждый путь адресации может быть описан с помощью простого, но довольно громоздкого синтаксиса. Существует также ряд синтаксических аббревиатур для краткого обозначения основных случаев. Сперва в этой главе с помощью развернутого синтаксиса будет дано разъяснение семантики путей адресации. Затем будет показано, каким образом сокращенный синтаксис приводится к развернутому (см. ).
Ниже приводятся некоторые примеры путей адресации, использующих развернутый синтаксис:
child::para находит элемент para, являющийся непосредственным потомком узла контекста
child::* собирает все элементы, являющиеся непосредственными потомками узла контекста
child::text() собирает все текстовые узлы, являющиеся непосредственными потомками узла контекста
child::node() собирает все непосредственные потомки текущего узла контекста независимо от типа этих узлов
attribute::name в текущем узле контекста находит атрибут name
attribute::* собирает все атрибуты в текущем узле контекста
descendant::para среди потомков узла контекста находит элементы para
ancestor::div собирает все предки div текущего узла контекста
ancestor-or-self::div собирает предки div текущего узла контекста и также, если сам узел контекста тоже является элементом div, включает в набор и его
descendant-or-self::para среди потомков узла контекста выбирает элементы para а также, если сам узел контекста является элементом para, то включает в набор и его
self::para выбирает текущий узел контекста, если это элемент para, либо в противном случае не выбирает ничего
child::chapter/descendant::para выбирает элементы para среди потомков элемента chapter, являющегося непосредственным потомком текущего узла контекста
child::*/child::para собирает все para, являющиеся потомками текущего узла контекста во втором поколении
/ находит корень документа (который всегда является родителем элемента документа)
/descendant::para в документе, которому принадлежит узел контекста, находит все элементы para
и адресации
Шаги адресации (location step) состоят из трех частей:
оси (axis), указывающей дерево взаимоотношений между текущим узлом контекста и узлами, отбираемыми на данном шаге адресации,
правила проверки узлов, указывающего тип и узлов, отбираемых на данном шаге адресации,
нуля или более предикатов, использующих произвольные выражения для дальнейшего отсева в наборе узлов, собранных на данном шаге адресации.
Синтаксис шага адресации образуется из названия оси и правила проверки узлов, отделенных друг от друга двумя символами двоеточия. За ними следует нуль или более выражений, каждое из которых заключено в квадратные скобки. Например, в выражении child::para[position()=1] фрагмент child - это название оси, para - правило проверки узла, а [position()=1] - предикат.
Набор узлов, собранных на данном шаге адресации, - это множество узлов, полученных в результате обработки ранее собранного набора узлов с учетом оси, правила проверки узлов и последующего отсева полученного набора узлов каждым из представленных предикатов.
Исходный набор узлов образуется из узлов, имеющих с текущим узлом контекста взаимосвязь, определяемую указанной осью, имеющих тип узла и , отвечающих представленному правилу проверки узлов. Например, шаг адресации descendant::para находит элементы para, являющиеся потомками текущего узла контекста: descendant указывает, что каждый узел в первоначальном наборе должен быть потомком текущего узла контекста, а para указывает, что каждый узел в исходном наборе должен быть элементом с названием para. Можно использовать оси, описаные в главе . Возможные правила проверки описаны в главе , причем смысл некоторых правил проверки меняется в зависимости от используемой оси.
Полученный исходный набор узлов фильтруется в соответствии с первым предикатом для получения нового набора узлов, затем этот новый набор фильтруется в соответствии со вторым предикатом и так далее. Окончательный набор узлов и будет тем самым набором, который получен в результате выполнения данного шага адресации. Выбранная ось оказывает влияние на обработку выражения для каждого предиката, а потому семантика предиката строится отталкиваясь от оси. См. .
Сокращенный синтаксис
Некоторые примеры путей адресации, использующих сокращенный синтаксис:
para находит элемент para, являющийся непосредственным потомком текущего узла контекста
* находит все элементы, являющиеся непосредственными потомками текущего узла контекста
text() находит все текстовые узлы, являющиеся непосредственными потомками текущего узла контекста
@name выделяет атрибут name в текущем узле контекста
@* находит все атрибуты текущего узла контекста
para[1] находит первый непосредственный потомок para текущего узла контекста
para[last()] находит последний непосредственный потомок para текущего узла контекста
*/para находит все потомки во втором поколении para текущего узла контекста
/doc/chapter[5]/section[2] в doc в пятом chapter находит второй section
chapter//para собирает элементы para, являющиеся потомками элемента chapter, который является непосредственным потомком текущего узла контекста
//para собирает все para, являющиеся потомками корневого узла документа, то есть находит все элементы para в том документе, где располагается текущий узел контекста
//olist/item в документе, где располагается текущий узел контекста, находит все элементы item, имеющие родителем olist
. выделяет текущий узел контекста
.//para собирает элементы para, являющиеся потомками текущего узла контекста
.. выделяет родителя текущего узла контекста
../@lang выделяет атрибут lang, принадлежащий родителю текущего узла контекста
para[@type="warning"] находит все непосредственные потомки para текущего узла контекста, имеющие атрибут type со значением warning
para[@type="warning"][5] находит пятый по счету из непосредственных потомков para текущего узла контекста, имеющих атрибут type со значением warning
para[5][@type="warning"] извлекает пятый непосредственный потомок para текущего узла контекста, если этот потомок имеет атрибут type со значением warning
chapter[title="Introduction"] получает непосредственный потомок текущего узла контекста chapter, который в свою очередь имеет один или несколько непосредственных потомков title со , равным Introduction
chapter[title] находит непосредственный потомок chapter текущего узла контекста, который имеет один или несколько непосредственных потомков title
employee[@secretary and @assistant] находит все непосредственные потомки employee данного узла контекста, которые имеют оба атрибута secretary и assistant
Самой важной является аббревиатура child::, которую при записи шага адресации всегда можно опустить. Фактически, child используется как ось по умолчанию. Например, путь адресации div/para становится сокращением для child::div/child::para.
Аналогичные аббревиатуры имеются и для атрибутов: attribute:: может быть сокращен до @. Например, путь адресации para[@type="warning"] является сокращением для child::para[attribute::type="warning"], а следовательно, находит непосредственные потомки para, имеющие атрибут type, значение которого равно warning.
// является сокращением для /descendant-or-self::node()/. Например, //para - это сокращение для /descendant-or-self::node()/child::para, а потому будет находить в документе все элементы para (путь //para найдет элемент para, даже если последний является элементом документа, поскольку узел элемента документа является непосредственным потомком корневого узла). div//para - это сокращение для div/descendant-or-self::node()/child::para, а потому находит все потомки para для непосредственного потомка div. Замечание: Путь адресации //para[1] имеет иное значение, чем путь адресации /descendant::para[1]. Последний отыскивает первый элемент-потомок para, а предыдущий находит все элементы-потомки para, являющиеся для своего родителя первым непосредственным потомком para.
Шаг адресации . является сокращением для self::node(). Особенно эта запись полезна в сочетании с //. Например, путь адресации .//para является сокращением для self::node()/descendant-or-self::node()/child::para
а потому будет находить все элементы para, являющиеся потомками текущего узла контекста.
Точно так же, шаг адресации .. является сокращением для parent::node(). Например, ../title - это сокращенная запись для parent::node()/child::title, а потому для родителя текущего узла контекста будет находить непосредственные потомки title.
Соответствие
XPath изначально создавался как компонент для использования в других спецификациях. Поэтому XPath обращается к использующим его спецификациям (таким как или ) за получением критериев проверки реализаций XPath, вместо того чтобы самому формулировать критерии оценки независимых реализаций XPath.
Статус этого документа
Данный документ был рассмотрен членами W3C и другими заинтересованными сторонами и утвержден Директором в качестве W3C. Данный документ является окончательным и может быть использован для ссылок и цитирования в других материалах в качестве нормативного документа. Участие организации W3C в разработке данной Рекомендации заключается в привлечении внимания к представленной спецификации и содействии ее широкому распространению. Результатом этой деятельности является повышение функциональности и универсальности Сети.
Перечень ошибок, выявленных в данной спецификации, доступен по адресу .
Комментарии к этой спецификации можно отправлять по адресу , доступен комментариев.
Несмотря на то, что нормативную силу имеет только английская версия данной спецификации, по адресу можно обнаружить ее перевод на другие языки.
По адресу можно найти перечень текущих Рекомендаций W3C и другие технические материалы.
Данная спецификация является совместным результатом деятельности рабочих групп XSL и XML Linking, а потому является частью сразу двух проектов и .
Строки
Строки образуются последовательностью из нуля и более символов, определенных в Рекомендации XML . Следовательно, в XPath каждый символ соответствует единственному абстрактному символу Unicode с единственным соответствующим скалярным значением Unicode (см. ). Это не то же самое, что 16-битное значение кода Unicode, когда абстрактный символ со скалярным значением, большим чем U+FFFF, представляется в кодировке Unicode парой 16-битных значений (суррогатной парой). Во многих языках программирования строка представляется в виде последовательности 16-битных значений кодировки Unicode. Реализация XPath с помощью таких языков должна гарантировать, что каждая суррогатная пара обрабатывается именно как один символ XPath. Замечание: В кодировке Unicode две строки могут считаться идентичными даже несмотря на то, что они образованы различными последовательностями абстрактных символов Unicode. Например, некоторые ударные символы могут быть представлены как в собранном (precompressed), так и в разобранном (decompressed) виде. Поэтому выражения XPath могут дать неожиданный результат, если такие символы в XPath выражении и в XML документе не были нормализованы в каноническую форму. См. документ .
Текстовые узлы
Символьные данные группируются в узлы текста. В каждый из таких узлов помещается столько символьных данных, сколько возможно: с текстовым узлом ни до, ни после не может соседствовать какой-либо другой текстовый узел, имеющий того же родителя. текстового узла являются эти самые текстовые данные. Текстовый узел всегда содержит по крайней мере один символ данных.
Все символы в секции CDATA обрабатываются как символьные данные. Таким образом, запись <![CDATA[<]]> в исходном документе будет обрабатываться так же, как и <. Оба варианта будут иметь результатом один символ < в текстовом узле дерева документа. Таким образом, секция CDATA обрабатывается так, словно были удалены комбинации <![CDATA[ и ]]>, а все символы < и & были заменены на < и & соответственно. Замечание: Если текстовый узел, содержащий символ <, записывается как XML, сам символ < должен маскироваться, например, с помощью < или помещением в секцию CDATA.
Символьные данные в комментариях, инструкциях обработки и значениях атрибутов текстовых узлов не образуют. Концы строк во внешних сущностях нормализуются в #xA в соответствии с Рекомендацией XML .
Текстовый узел не имеет.
Уникальные ID
Узел элемента может иметь уникальный идентификатор (ID). Значение этого атрибута декларируется в DTD как тип ID. Никакие два элемента в пределах одного документа не могут иметь одинаковые уникальные идентификаторы. Если XML процессор сообщает о существовании в документе двух элементов, имеющих один и тот же уникальный идентификатор (а такое возможно только если этот документ недействителен), то из двух данных элементов тот, который встретился в документе позже, будет обрабатываться как не имеющий уникального идентификатора. Замечание: Если документ не имеет DTD, то ни один из его элементов не будет иметь уникального идентификатора.
Узлы атрибутов
С каждым узлом элемента связан набор узлов атрибутов. При этом, хотя сам элемент является каждого из этих узлов атрибутов, узел атрибута непосредственным потомком своего родительского элемента не является. Замечание: В этом заключается отличие от модели DOM, где элемент, владеющий атрибутом, родителем этого атрибута не считается (см. ).
Элементы не могут совместно использовать узлы атрибутов: Если один узел элемента отличается от другого, то ни один из узлов атрибутов, относящихся к первому узлу элемента, не может совпасть ни с одним узлом атрибута, относящимся ко второму узлу элемента. Замечание: Оператор = проверяет, имеют ли два узла одно и то же значение, однако не проверяет, являются ли они одним и тем же узлом. Таким образом, атрибуты двух различных элементов можно сравнивать с помощью оператора =, даже несмотря на то, что они представлены различными узлами.
Атрибут, подставляемый по умолчанию, обрабатывается точно так же, как атрибут, указанный явно. Если для данного типа элемента в DTD атрибут был декларирован со значением по умолчанию #IMPLIED, однако в элементе этот атрибут представлен не был, считается, что в наборе атрибутов указанного элемента нет узла для этого атрибута.
Некоторые атрибуты, такие как xml:lang и xml:space, имеют семантику, которая распространяется на все элементы, являющиеся потомками элемента с этим атрибутом (если затем семантика не была переопределена таким же атрибутом в другом элементе, являющемся его потомком). Однако это не накладывает ограничений на местоположение узлов атрибутов в дереве документа: любой элемент имеет узлы только тех атрибутов, которые либо были явно указаны в начальном тэге или тэге пустого элемента, относящихся в этому элементу, либо были явно декларированы в DTD со значением по умолчанию.
Узел атрибута имеет и . получается при обработке , указанного в соответствующем тэге XML документа согласно Рекомендации XML Namespaces . Если атрибута не имеет префикса, URI пространства имен для имени атрибута будет нулевым. Замечание: Согласно нотации в Приложении A.3 документа , локальная часть расширенного имени соответствует атрибуту name элемента ExpAName, URI пространства имен расширенного имени соответствует атрибуту ns элемента ExpAName и будет нулевым, если атрибут ns в элементе ExpAName опущен.
Узел атрибута имеет . нормализовано в соответствии с Рекомендацией XML . Не предусмотрено специальной обработки для атрибута, чье нормализованное значение становится строкой нулевой длины - результатом будет узел атрибута, чьим становится строка нулевой длины. Замечание: во внешнем DTD или внешней сущности параметра могут декларироваться атрибуты по умолчанию. Согласно рекомендации XML, если процессор XML не является проверяющим, он не обязан читать внешние DTD и внешние параметры. Соответственно, с некоторыми непроверяющими XML процессорами могут не работать стили и другой функционал, предполагающий, что дерево XPath содержит значения атрибутов по умолчанию, декларированные во внешнем DTD или сущности параметра.
Для атрибутов, декларирующих пространства имен, соответствующих узлов атрибутов не предусмотрено (см. ).
Узлы инструкций обработки
Для каждой инструкции обработки создается соответствующий узел. Исключение составляют инструкции обработки, помещенные в декларацию типа документа.
Инструкция обработки имеет , в котором локальная часть - это адресат инструкции обработки, а URI пространства имен является нулевым. узла инструкции обработки - это та часть инструкции обработки, которая следует за адресатом и возможным пробельным символом. В состав строкового значения также не попадает завершающая комбинация ?>. Замечание: Декларация XML инструкцией обработки не является. Соответственно, ни один из узлов инструкции обработки не может соответствовать декларации XML.
Узлы элементов
Для каждого элемента в документе создается узел элемента. Узел элемента имеет , получаемое при обработке этого элемента, которое, согласно рекомендации XML Namespaces , указывается в соответствующем теге. Если не имеет префикса и нет пространства имен, используемого по умолчанию, то URI пространства имен для данного элемента будет нулевым. Замечание: Согласно нотации в Приложении A.3 документа , локальная часть расширенного имени соответствует атрибуту type в элементе ExpEType. URI пространства имен для расширенного имени соответствует атрибуту ns в элементе ExpEType и становится нулевым, если такой атрибут не был представлен.
Непосредственными потомками узла элемента могут быть узлы элементов, узлы комментариев, узлы инструкций обработки и текстовые узлы, образующие его содержание. При этом обрабатываются ссылки на внутренние и внешние сущности. Выполняется подстановка для ссылок на символы.
узла элемента является объединением всех текстовых узлов, являющихся данного узла элемента и предварительно отсортированных согласно порядку появления в документе.
Узлы комментариев
Для каждого комментария создается соответствующий узел. Исключение составляют комментарии, расположенные в декларации типа документа.
комментария является содержимое этого комментария за исключением открывающей <!-- и закрывающей --> комбинаций.
Узлы комментария не имеют.
Узлы пространства имен
С каждым элементом связан набор узлов пространства имен: по одному на каждый новый префикс пространства имен, появившийся в области видимости этого элемента, (включая и перфикс xml, явным образом декларированный Рекомендацией XML Namespaces ), и еще один узел для пространства имен по умолчанию, если таковое имеется в области видимости элемента. Данный элемент является каждого такого узла пространства имен, однако узел пространства имен непосредственным потомком соответствующего элемента родителя не становится. Элементы не могут совместно использовать узлы пространства имен: если один узел элемента отличается от другого узла элемента, то ни один из узлов пространства имен, принадлежащих одному элементу, не может совпасть с узлом пространства имен, относящихся ко второму узлу элемента. Это означает, что элемент получит узел пространства имен:
для каждого атрибута элемента, чье имя начинается с xmlns:,
для каждого атрибута в элементе-предке, чье имя начинается с xmlns:, при условии что данный префикс не был затем переопределен самим элементом или его более близким предком,
для атрибута xmlns, если сам элемент или какой-либо из его предков имеют атрибут xmlns и при этом атрибут xmlns самого ближайшего из таких элементов не является пустым Замечание: Атрибут xmlns="" отменяет декларацию пространства имен по умолчанию (см. ).
Узел пространства имен имеет , локальная часть которого является префиксом пространства имен (она является пустой, если данный узел относится к пространству имен по умолчанию), а идентификатор URI пространства имен всегда нулевой.
узла пространства имен - это URI пространства имен, связанного с данным префиксом пространства имен. Если данный URI окажется относительным, он должен обрабатываться точно так же, как URI пространства имен в .
Язык XPath является результатом попыток
Язык XPath является результатом попыток создать единые синтаксис и семантику для функционала, совместно используемого XSL Transformations и XPointer . Главная задача языка XPath - адресация частей в XML документе . Для достижения этой цели язык дополнительно наделен основными функциями для манипулирования строками, числами и булевыми значениями. В XPath используется компактный синтаксис, отличный от принятого в XML, облегчающий использование языка XPath при записи адресов URI и значений атрибутов XML. XPath работает не с внешним синтаксисом XML документа, а с его абстрактной логической структурой. XPath получил такое название потому, что использовался в URL для записи путей, обеспечивающих навигацию по иерархической структуре XML документа.
Язык XPath спроектирован так, что помимо поддержки адресации он обладает естественным набором элементов, которые могут использоваться для сравнения (проверки, соответствует ли узел некому шаблону). Такой порядок использования языка XPath описывается в спецификации .
XPath представляет XML документ в виде дерева узлов. Узлы бывают различных типов, например, узлы элементов, узлы атрибутов и узлы текста. Для каждого типа узлов в XPath определяется способ вычисления . Некоторые типы узлов имеют также имя. XPath полностью поддерживает пространства имен XML . В результате, имя любого узла в этом языке образуется из двух частей: локальной части и URI некого пространства имен (возможно, нулевого), такая комбинация называется . Указанная модель данных подробно описана в главе .
Главной синтаксической конструкцией языка XPath является выражение. Любое выражение соответствует сценарию . В результате обработки выражения получается объект, относящийся к одному из четырех основных типов:
набор узлов (node-set) - неупорядоченный набор узлов без дубликатов булево значение (boolean) - true или false число (number) - число с плавающей точкой строка (string) - последовательность UCS символов
Обработка выражений осуществляется, отталкиваясь от некого контекста. В спецификациях XSLT и XPointer указывается, каким образом в XSLT и XPointer, соответственно, определяется контекст для выражений XPath. Контекст образуется из:
узла (узел контекста, context node) пары ненулевых положительных целых чисел (положение в контексте и размер контекста)
привязки переменных контекста (variable bindings) библиотеки функций набора деклараций пространства имен в области видимости данного выражения
Положение в контексте всегда меньше или равно размеру контекста.
Схема привязки переменных контекста образуется в результате отображения множества имен переменных на множество значений переменных. Значением переменной является объект, относящийся к одному из типов, допустимых для значений выражений, либо к какому-либо дополнительному типу, не описанному в спецификации.
Библиотека функций образуется в результате отображения множества названий функций на множество функций. Каждая функция имеет нуль или более аргументов и возвращает один результат. В данном документе описывается основная библиотека функций, которую должны поддерживать все реализации XPath (см. ). Для любой функции в основной библиотеке и аргументы, и результат выполнения относятся к четырем основным типам. И XSLT, и XPointer дополняют XPath, определяя дополнительные функции, часть новых функций оперирует с четырьмя основными типами, остальные - дополнительными типами данных, определенными в XSLT и XPointer.
Декларации пространства имен образуются в результате отображения множества префиксов на множество идентификаторов URI пространств имен.
Привязка переменных контекста, библиотека функций и декларации пространства имен используются для обработки отдельных частей выражения и остаются неизменными на протяжении обработки всего выражения. Узел контекста, размер контекста и положение в контексте, используемые для обработки частей выражения, иногда могут отличаться от используемых для обработки выражения в целом. Некоторые типы выражений меняют текущий узел контекста, однако размер контекста и положение в контексте могут менять только предикаты (см. ). Если описывается обработка некоторого типа выражений, то всегда явно указывается, когда для обработки частей выражения используется другой узел контекста, измененные размер контекста или положение в контексте. Если же об узле контекста, размере контекста или положении в контексте в описании ничего не сказано, считается, что они остаются неизменными в ходе обработки всех подвыражений в выражении указанного типа.
Выражения XPath часто используются в атрибутах XML. Описываемая в этой главе грамматика примеряется к значению атрибута после выполнения нормализации, описанной в XML 1.0. Так, если, к примеру, в грамматике используется символ <, то в исходном XML документе его нельзя записывать просто как <. Вместо этого, согласно правилам XML 1.0, его необходимо маскировать, например, записав как <. Строковые значения, используемые в выражениях, заключаются в одинарные или двойные кавычки, которые используются также для записи атрибутов XML. Поэтому, чтобы символ кавычки в этом выражении не интерпретировался XML процессором как конец значения атрибута, его необходимо записывать как ссылку на символ (" или '). Впрочем, если атрибут XML был заключен в двойные кавычки, в выражении можно свободно использовать символы одинарных кавычек, и наоборот.
Другим важным типом выражений является путь адресации (location path). Путь адресации выбирает некое множество узлов, отталкиваясь от некоторого узла контекста. Результатом обработки выражения, соответствующего пути адресации, является множество узлов, собранных согласно этому пути. Путь адресации может рекурсивно содержать выражения, используемые для фильтрации наборов узлов. Путь адресации соответствует сценарию .
В представленной далее грамматике используются незавершенные конструктивы и , описанные в , а также пробельный символ , описанный в . Грамматика использует ту же самую нотацию EBNF, что (за исключением того, что названия грамматических конструкций всегда пишутся с заглавной буквы).
Обработка выражения начинается с его разбиения на строки символов, подлежащих преобразованию в лексемы. Затем идет разбор полученной последовательности лексем. В промежутки между лексемами могут свободно ставиться пробельные символы. Процесс преобразования в лексемы (tokenization) описан в главе .
Вызовы функций
При обработке выражения используется , позволяющее функцию в выражении сопоставить с библиотекой функций, соответствующей контексту обрабатываемого выражения, обработать каждый из , приведя к тому типу, который необходим для этой функции, и наконец вызвать саму функцию, передав ей преобразованные аргументы. Если указано неправильное количество аргументов или какой-либо аргумент не может быть приведен к требуемому типу, фиксируется ошибка. Результатом обработки выражения будет результат, возвращаемый соответствующей функцией.
Приведение аргумента к типу string осуществляется как при вызове функции . Приведение к типу number осуществляется как при вызове функции . Приведение к типу boolean осуществляется как при вызове функции . Аргумент, тип которого не соответствует набору узлов, уже не может быть приведен к этому типу.
[16] |
FunctionCall |
::= |
'(' ( ( ',' )* )? ')' |
|
[17] |
Argument |
::= |
|
|