Язык XML Path(XPath)

Данный документ является переводом Рекомендации W3C XML Path Language (XPath) Version 1.0 от 16 ноября 1999 года и может содержать ошибки перевода. Оригинальная версия данного документа на английском языке является единственной нормативной версией и находится по адресу: http://www.w3.org/TR/1999/REC-xpath-19991116.
Автор перевода: Олег Ткаченко <olegt@multiconn.com> (Multiconn International).

Copyright © 1999 W3C ® (MIT, INRIA, Keio), все права сохранены. Применяются все номативы W3C, связанные с ответственностью, торговыми марками, использованием документов и лицензированием программного обеспечения.

Язык XML Path (XPath)
Версия 1.0

Рекомендация W3C от 16 Ноября 1999

Эта версия:
http://www.w3.org/TR/1999/REC-xpath-19991116
(доступна в виде XML или HTML)
Последняя версия:
http://www.w3.org/TR/xpath
Предыдущие версии:
http://www.w3.org/TR/1999/PR-xpath-19991008
http://www.w3.org/1999/08/WD-xpath-19990813
http://www.w3.org/1999/07/WD-xpath-19990709
http://www.w3.org/TR/1999/WD-xslt-19990421
Редакторы:
James Clark <jjc@jclark.com>
Steve DeRose (Inso Corp. и Brown University) <Steven_DeRose@Brown.edu>

Copyright © 1999 W3C ® (MIT, INRIA, Keio), все права сохранены. Применяются все номативы W3C, связанные с ответственностью, торговыми марками, использованием документов и лицензированием программного обеспечения.

Аннотация

XPath является языком для адресации частей XML документа, разработанный для использования в XSLT и XPointer.

Статус этого документа

Данный документ был рассмотрен членами W3C и другими заинтересованными сторонами и был одобрен Директором как рекомендация W3C. Он является законченным во всех отношениях и может быть использован в роли справочного материала или цитирован в качестве нормативной ссылки в других документах. Роль W3C в создании этой Рекомендации заключается в привлечении внимания к предлагаемой спецификации и способствовании ее широкому распространению. Это повышает функциональность и способность к взаимодействию узлов Web.

Список ошибок и опечаток, обнаруженных в этой спецификации, находится по адресу: http://www.w3.org/1999/11/REC-xpath-19991116-errata.

Комментарии к этой спецификации Вы можете посылать по адресу: www-xpath-comments@w3.org (архив комментариев).

Версия этой спецификации на английском языке является единственной нормативной версией. Переводы этого документа можно найти по адресу: http://www.w3.org/Style/XSL/translations.html.

Список текущих рекомендаций W3C и другие технические документы можно найти по адресу: http://www.w3.org/TR.

Эта спецификация - результат совместной работы XSL Working Group и XML Linking Working Group и, таким образом, является частью W3C Style activity и W3C XML activity.

Содержание

1 Введение
2 Пути выборки
2.1 Шаги выборки
2.2 Оси навигации
2.3 Тесты узлов
2.4 Предикаты
2.5 Сокращенный синтаксис
3 Выражения
3.1 Основы
3.2 Вызовы функций
3.3 Множества узлов
3.4 Булевы значения
3.5 Числа
3.6 Строки
3.7 Лексическая структура
4 Базовая библиотека функций
4.1 Функции множеств узлов
4.2 Строковые функции
4.3 Булевы функции
4.4 Численные функции
5 Модель данных
5.1 Корневой узел
5.2 Узлы элементов
5.2.1 Уникальные идентификаторы
5.3 Узлы атрибутов
5.4 Узлы пространств имен
5.5 Узлы инструкций по обработке
5.6 Узлы комментариев
5.7 Текстовые узлы
6 Соответствие

Приложения

A Ссылки
A.1 Нормативные ссылки
A.2 Другие ссылки
B Отображение информационного множества XML (ненормативная часть)
С Словарь перевода терминов (приложение переводчика)

1 Введение

Язык XPath есть результат усилий, направленных на создание общего синтаксиса и семантики для функциональности, общей для XSL Transformations [XSLT] и XPointer [XPointer]. Основным назначением XPath является адресация частей XML [XML] документа. В поддержку этой первичной цели он также обеспечивает основные средства для обработки строк, чисел и булевых выражений. XPath использует компактный, не-XML синтаксис для облегчения применения XPath в URI и в значениях атрибутов в XML документах. XPath оперирует абстрактной, логической структурой XML документа, а не внешним синтаксисом. Название языка XPath происходит от его путевидной нотации, как в URL, для навигации по иерархической структуре XML документа.

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

XPath моделирует XML документ как дерево узов. Существуют различные типы узлов, включая узлы элементов (element nodes), узлы атрибутов (attribute nodes) и текстовые узлы (text nodes). XPath определяет способ вычисления строкового значения (string-value) для каждого типа узла. Некоторые типы узлов также имеют имена. XPath полностью поддерживает пространства имен XML (XML Namespaces) [XML Names]. Таким образом, имя узла представлено в виде пары, состоящей из локальной части и возможно нулевого URI пространства имен; такая пара называется расширенным именем (expanded-name). Модель данных подробно описана в [5 Модель данных].

Основной синтаксической конструкцией в XPath является выражение. Выражение соответсвует правилу формальной грамматики Expr. Результатом вычисления выражения является объект одного из четырех базовых типов:

  • множество узлов (node set) (неупорядоченное множество узлов, не содержащее дубликатов)
  • булево значение (истина или ложь)
  • число (число с плавающей точкой)
  • строка (последовательность UCS символов)

Выражение вычисляется с учетом контекста. XSLT и XPointer предписывают, каким образом определяется контекст для используемых в них XPath выражений. Контекст состоит из:

  • узла (контекстный узел)
  • пары ненулевых положительных целых (позиция контекста и размер контекста)
  • множество связанных переменных
  • библиотека функций
  • набор объявлений пространств имен в области видимости выражения

Значение позиции контекста всегда меньше или равно размеру контекста.

Множество связанных переменных состоит из отображений имен переменных на их значения. Значением переменной является объект, который может принадлежать любому типу, разрешенному для значения выражения или любому из дополнительных типов, не определенных в данном документе.

Библиотека функций состоит из отображений имен функций на функции. Каждая функция принимает нуль или более аргументов и возвращает единственный результат. Этот документ определяет базовую библиотеку функций, которую обязаны поддерживать все реализации XPath (смотри [4 Базовая библиотека функций]). Аргументы и возвращаемое значение функций из базовой библиотеки принадлежат одному из четырех базовых типов. XSLT и XPointer расширяют XPath посредством определения дополнительных функций. Некоторые из этих функций оперируют значениями четырех базовых типов, другие - значениями дополнительных типов данных, определенных в XSLT и XPointer.

Объявления пространств имен состоят из отображений префиксов на URI пространств имен.

Множество связанных переменных, библиотека функций и объявления пространств имен, используемые для вычисления подвыражения, всегда тождественны использемым для вычисления выражения в целом. Контекстный узел, позиция контекста и размер контекста, используемые для вычисления подвыражения, в некоторых случаях отличаются от используемых для вычисления выражения в целом. Некоторые виды выражений изменяют контекстный узел; только предикаты изменяют позицию контекста и размер контекста (смотри [2.4 Предикаты]). Во время описания вычисления выражения некоторого вида всегда будет явно указано на изменение контекстного узла, позиции контекста или размера контекста при вычислении подвыражения; если о контекстном узле, позиции контекста и размере контекста ничего не сказано, это значит что они остаются неизменными при вычислении подвыражений такого вида выражений.

XPath выражения часто находятся в XML атрибутах. Грамматические правила, определенные в данном разделе, относятся к значениям атрибутов, нормализованным согласно XML 1.0. Так, например, если некое грамматическое правило использует символ <, то этот символ не должен появится в XML документе как <, а обязан быть представлен в виде ссылки согласно правилам, определенным в спецификации XML 1.0, например, в виде &lt;. Строковые литералы, содержащиеся в выражениях, ограничены одинарными или двойными кавычками, которые также используются для определения границ XML атрибутов. Для того, чтобы кавычки, содержащиеся в выражении, не были интерпретированы XML процессором как окончание значения атрибута, кавычки должны быть записаны в виде ссылки на символ (&quot; или &apos;). Как альтернатива, выражение может использовать одинарные кавычки, если XML атрибут ограничен двойными кавычками, или наоборот.

Одним из важных видов выражений является путь выборки (location path). Путь выборки выбирает множество узлов относительно контекстного узла. Результат вычисления выражения, являющегося путем выборки, есть множество узлов, содержащее узлы, выбранные этим путем выборки. Пути выборки могут в свою очередь содержать выражения, используемые для для фильтрации множеств узлов. Путь выборки соответствует грамматическому правилу LocationPath.

Используемые во всех последующих грамматических правилах нетерминалы QName и NCName определены в [XML Names], а S определено в [XML]. При описании грамматики, также как и в спецификации [XML], используется EBNF нотация (за исключением того, что грамматические идентификаторы всегда начинаются с большой буквы).

Выражения разбираются следующим образом: сначала разбираемая строка симолов разбивается на токены, а затем разбирается результирующая последовательность токенов. Пробельные символы могут быть свободно размещены между токенами. Процесс разбиения на токены описан в [3.7 Лексическая структура].

2 Пути выборки

Хотя пути выборки не являются наиболее общей грамматической конструкцией в данном языке (LocationPath есть специальный случай Expr), они представляют собой наиболее важную конструкцию и, поэтому, будут описаны в первую очередь.

Каждый путь выборки может быть выражен с помощью простого, но довольно многословного синтаксиса. Существует также множество синтаксических сокращений, которые позволяют выразить некотрые часто используемые конструкции в краткой форме. В данном разделе при объяснении семантики путей выборки будет использоваться несокращенный синтаксис. Затем будет объяснено, как сокращенный синтаксис преобразуется в несокращенный (смотри [2.5 Сокращенный синтаксис]).

Ниже приведены некоторые примеры путей выборки, использующие несокращенный синтаксис:

  • 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, являющиеся внуками контекстного узла

  • / выбирает корень документа (который всегда является родителем элемента-документа (document element))

  • /descendant::para выбирает все элементы para в документе, к которому принадлежит контекстный узел

  • /descendant::olist/child::item выбирает все элементы item, которые имеют olist родителя и принадлежат к тому же документу, что и контекстный узел

  • child::para[position()=1] выбирает первый элемент para, являющийся ребенком контекстного узла

  • child::para[position()=last()] выбирает последний элемент para, являющийся ребенком контекстного узла

  • child::para[position()=last()-1] выбирает предпоследний элемент para, являющийся ребенком контекстного узла

  • child::para[position()>1] выбирает все, кроме первого, элементы para, являющиеся детьми контекстного узла

  • following-sibling::chapter[position()=1] выбирает элемент chapter, являющийся следующим братом контекстного узла

  • preceding-sibling::chapter[position()=1] выбирает элемент chapter, являющийся предыдущим братом контекстного узла

  • /descendant::figure[position()=42] выбирает сорок второй элемент figure в документе

  • /child::doc/child::chapter[position()=5]/child::section[position()=2] выбирает второй элемент section пятого элемента chapter элемента doc элемента-документа

  • child::para[attribute::type="warning"] выбирает все элементы para, являющиеся детьми контекстного узла, которые имеют атрибут type со значением warning

  • child::para[attribute::type='warning'][position()=5] выбирает пятый элемент para, являющийся ребенком контекстного узла, имеющий атрибут type со значением warning

  • child::para[position()=5][attribute::type="warning"] выбирает пятый элемент para, являющийся ребенком контекстного узла, если он имеет атрибут type со значением warning

  • child::chapter[child::title='Introduction'] выбирает все элементы chapter, являющиеся детьми контекстного узла, которые имеют один или более дочерний элемент title со строковым значением, эквивалентным Introduction

  • child::chapter[child::title] выбирает все элементы chapter, являющиеся детьми контекстного узла, которые имеют один или более дочерний элемент title

  • child::*[self::chapter or self::appendix] выбирает все элементы chapter и appendix, являющиеся детьми контекстного узла

  • child::*[self::chapter or self::appendix][position()=last()] выбирает последний chapter или appendix дочерний элемент контекстного узла

Существует два вида путей выборки: относительный путь выборки и абсолютный путь выборки.

Относительный путь выборки состоит из последовательности одного или более шагов выборки (location steps), разделенных /. Эти шаги в относительном пути выборки собираются вместе слева направо. Каждый шаг по очереди выбирает множество узлов относительно контекстного узла. Начальная последовательность шагов собирается вместе со следующим шагом следующим образом. Начальная последовательность шагов выбирает множество узлов относительно контекстного узла. Каждый узел в этом множестве используется как контекстный узел для следующего шага. Множества узлов, определенные таким шагом, объединяются вместе. Множество узлов, определенное посредством композиции шагов, является этим объединением. Например, child::div/child::para выбирает элементы para, являющиеся детьми элементов div, являющихся детьми контекстного узла, или, другими словами, внуки-элементы para, имеющие родителей div.

Абсолютный путь выборки состоит из /, возможно сопровождающегося относительным путем выборки. / сам по себе выбирает корневой узел (root node) документа, содержащего контекстный узел. Если за ним следует относительный путь выборки, тогда такой путь выборки выбирает множество узлов, которые были бы выбраны относительным путем выборки относительно корневого элемента документа, содержащего контекстный узел.

Пути выборки
[1] | LocationPath | ::= | RelativeLocationPath
 |  |  | | AbsoluteLocationPath
[2] | AbsoluteLocationPath | ::= | '/' RelativeLocationPath?
 |  |  | | AbbreviatedAbsoluteLocationPath
[3] | RelativeLocationPath | ::= | Step
 |  |  | | RelativeLocationPath '/' Step
 |  |  | | AbbreviatedRelativeLocationPath

2.1 Шаги выборки

Шаг выборки состоит из трех частей:

  • ось навигации (axis), определяющая родственность в дереве между узлами, выбираемыми шагом выборки, и контекстным узлом,

  • тест узла (node test), определяющий тип и расширенное имя узлов, выбираемых шагом выборки, и

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

Для записи шага выборки используется следующий синтаксис: ось навигации и тест узла, разделенные двойным двоеточием, сопровождающиеся нулем или более выражений, заключенных в квадратные скобки. Например, в шаге выборки child::para[position()=1], child есть имя оси, para есть тест узла, и [position()=1] есть предикат.

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

Начальное множество узлов состоит из узлов, родственных контекстному узлу согласно оси навигации, а также имеющих тип и расширенное имя согласно тесту узла. Например, шаг выборки descendant::para выбирает элементы para, являющиеся потомками контекстного узла: descendant определяет, что каждый узел в начальном множестве узлов должен быть потомком контекстного узла; para определяет, что каждый узел в начальном множестве узлов должен являтся элементом para. Виды осей навигации описаны в [2.2 Оси навигации]. Виды тестов узлов описаны в [2.3 Тесты узлов]. Значение некоторых тестов узлов зависит от оси навигации.

Начальное множество узлов фильтруется первым предикатом, результатом чего является новое множество узлов; это новое множество узлов фильтруется вторым предикатом и так далее. Заключительное множество узлов является множеством узлов, выбранным шагом выборки. Ось навигации влияет на вычисление выражений в каждом предикате и, таким образом, семантика предиката определена с учетом оси навигации. Смотри [2.4 Предикаты].

Шаги выборки
[4] | Step | ::= | AxisSpecifier NodeTest Predicate*
 |  |  | | AbbreviatedStep
[5] | AxisSpecifier | ::= | AxisName '::'
 |  |  | | AbbreviatedAxisSpecifier

2.2 Оси навигации

Существуют следующие оси навигации:

  • Ось навигации child содержит детей контекстного узла

  • Ось навигации descendant содержит потомков контекстного узла; потомком является ребенок или ребенок ребенка и так далее, таким образом, ось навигации descendant никогда не содержит атрибутов или узлов пространств имен (namespace nodes)

  • Ось навигации parent содержит родителя контекстного узла, если таковой существует

  • Ось навигации ancestor содержит предков контекстного узла; предки контекстного узла включают в себя родителя контекстного узла, родителя родителя и так далее, таким образом, ось навигации ancestor всегда включает в себя корневой узел, если только контекстный узел не является корневым узлом

  • Ось навигации following-sibling содержит всех последующих братьев контекстного узла; если контекстным узлом является атрибут или узел пространства имен, ось навигации following-sibling пуста

  • Ось навигации preceding-sibling содержит всех предыдущих братьев контекстного узла; если контекстным узлом является атрибут или узел пространства имен, ось навигации preceding-sibling пуста

  • Ось навигации following содержит все узлы в документе, к которому принадлежит контекстный узел, которые следуют позже контекстного узла в порядке просмотра документа (document order), исключая всех его потомков, все атрибуты и все узлы пространств имен.

  • Ось навигации preceding содержит все узлы в документе, к которому принадлежит контекстный узел, которые следуют прежде контекстного узла в порядке просмотра документа, исключая всех его предков, все атрибуты и все узлы пространств имен.

  • Ось навигации attribute содержит все атрибуты контекстного узла; эта ось навигации будет пуста, если контекстный узел не является элементом

  • Ось навигации namespace содержит узлы пространств имен контекстного уза; эта ось навигации будет пуста, если контекстный узел не является элементом

  • Ось навигации self содержит только сам контекстный узел

  • Ось навигации descendant-or-self содержит контекстный узел и всех его потомков

  • Ось навигации ancestor-or-self содержит контекстный узел и всех его предков; таким образом, ось навигации ancestor всегда содержит корневой узел.

ЗАМЕЧАНИЕ: Оси навигации ancestor, descendant, following, preceding и self разделяют документ на части (игнорируя атрибуты и узлы пространств имен): они не перекрываются и вместе содержат все узлы документа.
Оси навигации
[6] | AxisName | ::= | 'ancestor'
 |  |  | | 'ancestor-or-self'
 |  |  | | 'attribute'
 |  |  | | 'child'
 |  |  | | 'descendant'
 |  |  | | 'descendant-or-self'
 |  |  | | 'following'
 |  |  | | 'following-sibling'
 |  |  | | 'namespace'
 |  |  | | 'parent'
 |  |  | | 'preceding'
 |  |  | | 'preceding-sibling'
 |  |  | | 'self'

2.3 Тесты узлов

Каждая ось навигации имеет главный тип узлов. Если ось навигации может содержать элементы, то ее главным типом узлов являются элементы, иначе - тип узлов, которые она может содержать. Таким образом,

  • Для оси attribute главным типом узлов являются атрибуты.
  • Для оси namespace главным типом узлов являются узлы пространств имен.
  • Для других осей главным типом узлов являются элементы.

Тест узла, представляемый QName, есть истина только в случае, если тип узла (смотри [5 Модель данных]) является главным типом узлов и расширенное имя узла эквивалентно расширенному имени, определенному QName. Например, child::para выбирает para элементы, являющиеся детьми контекстного узла; если контекстный узел не имеет детей para, это выражение выберет пустое множество узлов. attribute::href выбирает атрибут href контекстного узла; если контекстный узел не имеет атрибута href, это выражение выберет пустое множество узлов.

QName в тесте узла преобразуется в расширенное имя с помощью объявлений пространств имен, содержащихся в контексте выражения. Это преобразование аналогично преобразованию, которому подвергаются имена типов элементов в стартовом и конечном тэгах, однако пространство имен по умолчанию, декларированное посредством xmlns, не используется: если QName не содержит префикса, URI пространства имен является нулевым (таким же способом преобразутся имена атрибутов). Это ошибка, если QName содержит префикс, для которого не существует объявления пространства имен в контексте выражения.

Тест узла * есть истина для любого узла, принадлежащего главному типу узлов. Например, child::* выберет все элементы, являющиеся детьми контекстного узла, и attribute::* выберет все атрибуты контекстного узла.

Тест узла может иметь форму NCName :*. В этом случае, префикс преобразуется способом, аналогичным QName, используя объявления пространств имен, содержащиеся в контексте. Это ошибка, если для префикса не существует соответствующего объявления пространства имен в контексте выражения. Такой тест узла будет истина для любого узла главного типа, чье расширенное имя имеет URI пространства имен, эквивалентное тому, в которое преобразуется префикс, независимо от локальной части имени.

Тест узла text() есть истина для любого текстового узла. Например, child::text() выберет текстовые узлы, являющиеся детьми контекстного узла. Аналогично, тест узла comment() есть истина для любого узла комментария (comment node), и тест узла processing-instruction() есть истина для любого узла инструкции по обработке (processing instruction node). Тест processing-instruction() может иметь аргумент, являющийся Literal, в этом случае он есть истина для любого узла инструкции по обработке, имеющего имя, эквивалентное значению Literal.

Тест узла node() есть истина для любого узла любого типа.

[7] | NodeTest | ::= | NameTest
 |  |  | | NodeType '(' ')'
 |  |  | | 'processing-instruction' '(' Literal ')'

2.4 Предикаты

Ось навигации может быть либо прямой, либо обратной. Ось, которая содержит только контекстный узел или узлы, следующие за контекстным в порядке просмотра документа, является прямой осью. Ось, которая содержит только контекстный узел или узлы, предшествующие контекстному в порядке просмотра документа, является обратной осью. Таким образом, оси ancestor, ancestor-or-self, preceding, и preceding-sibling являются обратными осями; все остальные оси являются прямыми. Поскольку ось навигации self всегда содержит не более одного узла, для нее не существуект различия, прямая она или обратная. Позиция близости члена множества узлов определяется с учетом оси навигации как позиция этого узла в множестве узлов, упорядоченном в порядке просмотра документа, если ось является прямой, или в обратном порядке просмотра документа, если ось является обратной. Нумерация позиций начинается с 1.

Предикат фильтрует множество узлов с учетом оси навигации и производит новое множество узлов. Для каждого узла в фильтруемом множестве узлов вычисляется PredicateExpr с этим узлом в качестве контекстного, с числом узлов в фильтруемом множестве узлов в качестве размера контекста, и с позицией близости этого узла в фильтруемом множестве узлов с учетом оси навигации в качестве позиции контекста; если результат вычисления PredicateExpr есть истина для данного узла, этот узел включается в новое множество узлов, иначе - нет.

PredicateExpr определяется путем вычисления Expr и приведения полученного результата к булеву типу. Если результат есть число, он будет преобразован в истину в случае, если это число равно позиции контекста, иначе он будет преобразован в ложь; если результат не является числом, тогда он будет преобразован способом, аналогичным вызову функции boolean. Таким образом, путь выборки para[3] эквивалентен para[position()=3].

Предикаты
[8] | Predicate | ::= | '[' PredicateExpr ']'
[9] | PredicateExpr | ::= | Expr

2.5 Сокращенный синтаксис

Ниже приведены некоторые примеры путей выборки, использующих сокращенный синтаксис:

  • para выбирает все элементы para, являющиеся детьми контекстного узла

  • * выбирает все элементы, являющиеся детьми контекстного узла

  • text() выбирает все текстовые узлы, являющиеся детьми контекстного узла

  • @name выбирает атрибут name контекстного узла

  • @* выбирает все атрибуты контекстного узла

  • para[1] выбирает первого para ребенка контекстного узла

  • para[last()] выбирает последнего para ребенка контекстного узла

  • */para выбирает всех para внуков контекстного узла

  • /doc/chapter[5]/section[2] выбирает второй элемент section - ребенок пятого элемента chapter элемента doc

  • 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 родительского элемента контекстного узла.

Сокращения
[10] | AbbreviatedAbsoluteLocationPath | ::= | '//' RelativeLocationPath
[11] | AbbreviatedRelativeLocationPath | ::= | RelativeLocationPath '//' Step
[12] | AbbreviatedStep | ::= | '.'
 |  |  | | '..'
[13] | AbbreviatedAxisSpecifier | ::= | '@'?

3 Выражения

3.1 Основы

VariableReference преобразуется в значение, с которым связано имя переменной во множестве связанных переменных текущего контекста. Это ошибка, если имя переменной не связано ни с каким значением во множестве связанных переменных контекста выражения.

Для группирования могут использоваться круглые скобки.

[14] | Expr | ::= | OrExpr
[15] | PrimaryExpr | ::= | VariableReference
 |  |  | | '(' Expr ')'
 |  |  | | Literal
 |  |  | | Number
 |  |  | | FunctionCall

3.2 Вызовы функций

Выражение FunctionCall вычисляется посредством использования FunctionName для идентификации функции в библиотеке функций, принадлежащей контексту вычисления выражения, вычисления каждого Argument, приведения каждого аргемента к типу, требуемому функцией, и, в заключение, вызова функции с преобразованными параметрами. Это ошибка, если число аргументов неверно или какой-либо из аргументов не может быть приведен к требуемому типу. Результатом FunctionCall является результат, возвращенный функцией.

Аргумент приводится к строковому типу способом, аналогичным вызову функции string. Аргумент приводится к численному типу способом, аналогичным вызову функции number. Аргумент приводится к булевому типу способом, аналогичным вызову функции boolean. Аргумент, не принадлежащий типу "множество узлов", не может быть приведен к этому типу.

[16] | FunctionCall | ::= | FunctionName '(' ( Argument ( ',' Argument )* )? ')'
[17] | Argument | ::= | Expr

3.3 Множества узлов

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

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

Предикаты (Predicate) используются для фильтрации выражений аналогично их использованию в путях выборки. Это ошибка, если фильтруемое выражение не вычисляет множество узлов. Predicate фильтрует множество узлов с учетом оси навигации child.

ЗАМЕЧАНИЕ: Смысл Predicate критическим образом зависит от применяемой оси навигации. Например, preceding::foo[1] возвращает первый элемент foo в обратном порядке просмотра документа , потому что ось, применяемая к предикату [1], является осью preceding; и наоборот, (preceding::foo)[1] возвращает первый элемент foo в порядке просмотра документа, потому что ось, применяемая к предикату [1], является осью child.

Операторы / и // собирают вместе выражение и относительный путь выборки. Это ошибка, если результатом вычисления выражения не является множество узлов. Оператор / осуществляет сборку аналогично тому, как / используется в путях выборки. Также как и в путях выборки, // есть сокращенная форма /descendant-or-self::node()/.

Не существует типов, объекты которых могут быть преобразованы в множество узлов.

[18] | UnionExpr | ::= | PathExpr
 |  |  | | UnionExpr '|' PathExpr
[19] | PathExpr | ::= | LocationPath
 |  |  | | FilterExpr
 |  |  | | FilterExpr '/' RelativeLocationPath
 |  |  | | FilterExpr '//' RelativeLocationPath
[20] | FilterExpr | ::= | PrimaryExpr
 |  |  | | FilterExpr Predicate

3.4 Булевы значения

Объекты булева типа могут одно из двух значений, истина или ложь.

Выражение or вычисляется путем вычисления каждого операнда и приведения его значения к булеву типу способом, аналогичным вызову функции boolean. Результат есть истина, если любое из этих значений есть истина, иначе результат есть ложь. Правый операнд не вычисляется, если результат вычисления левого операнда есть истина.

Выражение and вычисляется путем вычисления каждого операнда и приведения его значения к булеву типу способом, аналогичным вызову функции boolean. Результат есть истина, если оба этих значения есть истина, иначе результат есть ложь. Правый оператор не вычисляется, если результат вычисления левого операнда есть ложь.

EqualityExpr (которое не есть просто RelationalExpr) или RelationalExpr (которое не есть просто AdditiveExpr) вычисляется посредством сравнения объектов, являющихся результатами вычисления операндов. Сравнение результирующих объектов определяется в следующих трех параграфах. Во-первых, сравнения, в которых участвуют множества узлов, определяются в единицах сравнений, в которых не участвуют множества узлов; такие сравнения определяются единообразно для =, !=, <=, <, >= и >. Во-вторых, сравнения, в которых не участвуют множества узлов, определяются для = и !=. В-третьих, сравнения, в которых не участвуют множества узлов определяются для <=, <, >= и >.

Если оба сравниваемых объекта являются множествами узлов, тогда результат их сравнения будет истина только в случае, если в обоих множествах узлов существуют такие узлы, что результат сравнения их строковых значений есть истина. Если один из сравниваемых объектов есть множество узлов, а другой есть число, тогда результат их сравнения будет истина только в случае, если во множестве узлов существует такой узел, что результат сравнения его строкового значения, приведенного к численному типу с помощью функции number, и числа есть истина. Если один из сравниваемых объектов есть множество узлов, а другой есть строка, тогда результат их сравнения будет истина только в случае, если во множестве узлов существует такой узел, что результат сравнения его строкового значения и строки есть истина. Если один из сравниваемых объектов есть множество узлов, а другой есть булево значение, тогда результат их сравнения будет истина только в случае, если результат сравнения множества узлов, приведенного к булеву типу с помощью функции boolean и булева значения есть истина.

Когда ни один из сравниваемых объектов не является множеством узлов и оператор есть = или !=, тогда объекты сравниваются путем приведения их к общему типу по следующим правилам и последующего сравнения их. Если по крайней мере один из сравниваемых объектов есть булево значение, тогда каждый сравниваемый объект приводится к булеву типу способом, аналогичным применению функции boolean. Иначе, если по крайней мере один из сравниваемых объектов есть число, тогда каждый сравниваемый объект приводится к численному типу способом, аналогичным использованию функции number. Иначе оба объекта приводятся к строковому типу способом, аналогичным использованию функции string. Сравнение с помощью оператора = будет истина только в случае, если объекты равны; сравнение с помощью оператора != будет истина только в случае, если объекты не равны. Численные значения сравниваются согласно IEEE 754 [IEEE 754]. Два булева значения равны, если оба они есть истина или оба они есть ложь. Две строки равны только в случае, если они состоят из одной и той же последовательности UCS символов.

ЗАМЕЧАНИЕ: Если $x связано со множеством узлов, то $x="foo" не обозначает тоже самое, что not($x!="foo"): первое есть истина только в случае, если некоторый узел в $x имеет строковое значение foo; второе есть истина только в случае, если все узлы в $x имеют строковое значение foo.

Когда ни один из сравниваемых объектов не является множеством узлов и используемый оператор есть <=, <, >= или >, тогда объекты сравниваются путем приведения их к численному типу и последующего сравнения согласно IEEE 754. Сравнение < будет истина только в случае, если первое число меньше второго. Сравнение <= будет истина только в случае, если первое число меньше или равно второму. Сравнение > будет истина только в случае, если первое число больше второго. Сравнение >= будет истина только в случае, если первое число больше или равно второму.

ЗАМЕЧАНИЕ: Когда XPath выражение встречается в XML документе, все операторы < и <= должны быть представлены в виде ссылки согласно правилам XML 1.0 с помощью, например, &lt; и &lt;=. В следующем примере значение атрибута test есть XPath выражение:
<xsl:if test="@value &lt; 10">...</xsl:if>
[21] | OrExpr | ::= | AndExpr
 |  |  | | OrExpr 'or' AndExpr
[22] | AndExpr | ::= | EqualityExpr
 |  |  | | AndExpr 'and' EqualityExpr
[23] | EqualityExpr | ::= | RelationalExpr
 |  |  | | EqualityExpr '=' RelationalExpr
 |  |  | | EqualityExpr '!=' RelationalExpr
[24] | RelationalExpr | ::= | AdditiveExpr
 |  |  | | RelationalExpr '<' AdditiveExpr
 |  |  | | RelationalExpr '>' AdditiveExpr
 |  |  | | RelationalExpr '<=' AdditiveExpr
 |  |  | | RelationalExpr '>=' AdditiveExpr
ЗАМЕЧАНИЕ: Результатом вышеприведенных грамматических правил является следующий порядок старшинства операторов (начиная с наименьшего значения):

  • or

  • and

  • =, !=

  • <=, <, >=, >

Все операторы являются левоассоциативными. Например, выражение 3 > 2 > 1 есть эквивалент выражения (3 > 2) > 1, результат вычисления которого есть ложь.

3.5 Числа

Числа представляются в виде чисел с плавающей точкой. Число может иметь любое IEEE 754 значение в 64-битном формате двойной точности [IEEE 754]. Сюда включается специальное значение "не-число" (NaN), положительная и отрицательная бесконечности и положительный и отрицательный нуль. Смотри сводку ключевых правил стандарта IEEE 754 в Секции 4.2.3 [JLS].

Числовые операторы приводят свои операнды к численному типу способом, аналогичным вызову функции number.

Оператор + выполняет сложение.

Оператор - выполняет вычитание.

ЗАМЕЧАНИЕ: Поскольку XML позволяет использование символа - в именах, обычно необходимо предварять оператор - пробельным символом. Например, результат вычисления foo-bar есть множество узлов, содержащее дочерние элементы с именем foo-bar; результат вычисления foo - bar есть разница между результатом приведения строкового значения первого дочернего элемента foo к численному типу и результатом приведения строкового значения первого дочернего элемента bar к численному типу.

Оператор div выполняет деление с плавающей точкой согласно IEEE 754.

Оператор mod возвращает остаток от деления с усечением. Например,

  • 5 mod 2 дает 1

  • 5 mod -2 дает 1

  • -5 mod 2 дает -1

  • -5 mod -2 дает -1

ЗАМЕЧАНИЕ: Данный оператор есть аналог оператора % в Java и ECMAScript.
ЗАМЕЧАНИЕ: Данный оператор отличается от оператора remainder, определенного в IEEE 754, который возвращает остаток от деления с округлением.
Численные выражения
[25] | AdditiveExpr | ::= | MultiplicativeExpr
 |  |  | | AdditiveExpr '+' MultiplicativeExpr
 |  |  | | AdditiveExpr '-' MultiplicativeExpr
[26] | MultiplicativeExpr | ::= | UnaryExpr
 |  |  | | MultiplicativeExpr MultiplyOperator UnaryExpr
 |  |  | | MultiplicativeExpr 'div' UnaryExpr
 |  |  | | MultiplicativeExpr 'mod' UnaryExpr
[27] | UnaryExpr | ::= | UnionExpr
 |  |  | | '-' UnaryExpr

3.6 Строки

Строки состоят из последовательности нуля или более символов, каждый из которых определен аналогично определению символов в XML Рекомендации [XML]. Таким образом, любой одиночный символ в XPath соответствует одиночному абстрактному символу Unicode с соответствующим одиночным скалярным значением Unicode (смотри [Unicode]); это не тоже самое, что 16-битное кодовое значение Unicode: представление символа, кодированного согласно Unicode, для абстрактного символа со скалярным значением Unicode, превышающим U+FFFF есть пара 16-битных кодовых значений Unicode (суррогатная пара). Во многих языках программирования строки представляются в виде последовательности 16-битных кодовых значений Unicode; реализации XPath на таких языках должны позаботится о том, чтобы суррогатная пара корректно рассматривалась как одиночный XPath символ.

ЗАМЕЧАНИЕ: В Unicode допускается существование двух строк, которые должны рассматриваться как идентичные, даже если они состоят из различных последовательностей абстрактных символов Unicode. Например, некоторые акцентированые символы могут быть представлены либо в составной, либо в разложенной форме. Таким образом, XPath выражения могут возвращать непредсказуемый результат, если только символы в XPath выражении и в XML документе не были нормализованы в каноническую форму. Смотри [Character Model].

3.7 Лексическая структура

В процессе разбора на токены всегда возвращается самый длинный из возможных токенов.

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

Для устранения неоднозначностей грамматики ExprToken должны применяться следующие специальные правила разбора на токены в указанном порядке:

  • Если существует предыдущий токен и этот предыдущий токен не есть @, ::, (, [, , или Operator, тогда * должна быть распознана как MultiplyOperator и NCName должно быть распознано как OperatorName.

  • Если символ, следующий за NCName (возможно после промежуточного ExprWhitespace) есть (, тогда токен должен быть распознан как NodeType или FunctionName.

  • Если два символа, следующих за NCName (возможно после промежуточного ExprWhitespace) являются ::, тогда токен должен быть распознан как AxisName.

  • Иначе, токен не должен быть распознан как MultiplyOperator, OperatorName, NodeType, FunctionName, или AxisName.

Лексическая структура выражения
[28] | ExprToken | ::= | '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
 |  |  | | NameTest
 |  |  | | NodeType
 |  |  | | Operator
 |  |  | | FunctionName
 |  |  | | AxisName
 |  |  | | Literal
 |  |  | | Number
 |  |  | | VariableReference
[29] | Literal | ::= | '"' [^"]* '"'
 |  |  | | "'" [^']* "'"
[30] | Number | ::= | Digits ('.' Digits?)?
 |  |  | | '.' Digits
[31] | Digits | ::= | [0-9]+
[32] | Operator | ::= | OperatorName
 |  |  | | MultiplyOperator
 |  |  | | '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>='
[33] | OperatorName | ::= | 'and' | 'or' | 'mod' | 'div'
[34] | MultiplyOperator | ::= | '*'
[35] | FunctionName | ::= | QName - NodeType
[36] | VariableReference | ::= | '$' QName
[37] | NameTest | ::= | '*'
 |  |  | | NCName ':' '*'
 |  |  | | QName
[38] | NodeType | ::= | 'comment'
 |  |  | | 'text'
 |  |  | | 'processing-instruction'
 |  |  | | 'node'
[39] | ExprWhitespace | ::= | S

4 Базовая библиотека функций

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

Каждая функция в этой библиотеке функций определяется при помощи прототипа функции, который сообщает возвращаемый тип, имя функции, и типы аргументов. Если тип аргумента сопровожден знаком вопроса, тогда этот аргумент является необязательным; иначе аргумент является обязательным.

4.1 Функции множеств узлов

Функция: number last()

Функция last возвращает число, равное размеру контекста в контексте вычисления выражения.

Функция: number position()

Функция position возвращает число, равное позиции контекста в контексте вычисления выражения.

Функция: number count(node-set)

Функция count возвращает число узлов в аргументном множестве узлов.

Функция: node-set id(object)

Функция id выбирает элементы по их уникальному идентификатору (ID) (смотри [5.2.1 Уникальные идентификаторы]). Когда аргумент функции id принадлежит к типу множества узлов, тогда результатом является объединение результатов применения функции id к строковому значению каждого узла в аргументном множестве узлов. Когда аргумент функции id принадлежит к любому другому типу, аргумент приводится к строковому типу способом, аналогичным вызову функции string; полученная строка разбивается на разделенный пробельными символами список токенов (пробельными символами является любая последовательность символов, соответсвующих грамматическому правилу S); результатом является множество узлов, содержащее элементы в документе, к которому принадлежит контекстный узел, которые имеют уникальный идентификатор, равный любому токену в этом списке.

  • id("foo") выбирает элемент с уникальным идентификатором foo

  • id("foo")/child::para[position()=5] выбирает пятый элемент para, являющийся ребенком элемента с уникальным идентификатором foo

Функция: string local-name(node-set?)

Функция local-name возвращает локальную часть расширенного имени узла в аргументном множестве узлов, который является первым в порядке просмотра документа. Если аргументное множество узлов пусто или первый узел не имеет расширенного имени, возвращается пустая строка. Если аргумент отсутствует, он устанавливается по умолчанию как множество узлов, содержащее только контекстный узел.

Функция: string namespace-uri(node-set?)

Функция namespace-uri возвращает URI пространства имен расширенного имени узла в аргументном множестве узлов, который является первым в порядке просмотра документа. Если аргументное множество узлов пусто или первый узел не имеет расширенного имени, или URI пространства имен расширенного имени нулевой, возвращается пустая строка. Если аргумент отсутствует, он устанавливается по умолчанию как множество узлов, содержащее только контекстный узел.

ЗАМЕЧАНИЕ: Строка, возвращаемая функцией namespace-uri будет пустой для всех узлов, кроме элементов и атрибутов.

Функция: string name(node-set?)

Функция name возвращает строку, содержащую QName, представляющее расширенное имя узла в аргументном множестве узлов, который является первым в порядке просмотра документа. QName должно представлять расширенное имя с учетом объявлений пространств имен, действительных на узле, чье расширенное имя представляется. Обычно это будет QName, встретившееся в исходном XML. Это может быть не так, если существуют действительные на узле декларации пространств имен, которые ассоциируют множество префиксов с одним и тем же пространством имен. Однако, реализации могут сохранять информацию об оригинальном префиксе в их представлении узлов; в этом случае, реализации могут гарантировать, что возвращаемая строка будет всегда идентична QName, использованном в исходном XML. Если аргументное множество узлов пусто или первый узел не имеет расширенного имени, возвращается пустая строка. Если аргумент отсутствует, он устанавливается по умолчанию как множество узлов, содержащее только контекстный узел.

ЗАМЕЧАНИЕ: Строка, возвращаемая функцией name будет идентична строке, возвращаемой функцией local-name для всех узлов, кроме элементов и атрибутов.

4.2 Строковые функции

Функция: string string(object?)

Функция string преобразует объект в строку по следующим правилам:

  • Множество узлов преобразуется в строку путем возвращения в качестве результата строкового значения узла во множестве узлов, являющегося первым в порядке просмотра документа. Если множество узлов пусто, возвращается пустая строка.

  • Число преобразуется в строку следующим образом:

    • NaN преобразуется в строку NaN

    • положительный нуль преобразуется в строку 0

    • отрицательный нуль преобразуется в строку 0

    • положительная бесконечность преобразуется в строку Infinity

    • отрицательная бесконечность преобразуется в строку -Infinity

    • если число является целым, такое число представляется в десятичной форме аналогично Number без десятичной точки и без лидирующих нулей, предваренной знаком минус (-) в случае отрицательного числа

    • иначе, число представляется в десятичной форме аналогично Number, включая десятичную точку с, по крайней мере, одной цифрой перед ней, и, по крайней мере, одной цифрой после нее, предваренной знаком минус (-) в случае отрицательного числа; перед десятичной точкой не должно быть лидирующих нулей, не считая случая одной требуемой цифры непосредственно перед десятичной точкой; после одной требуемой цифры после десятичной точки может быть так много (но не более) цифр, сколько необходимо для того, чтобы уникально отличить это число от всех других числовых значений IEEE 754.

  • Булево значение ложь преобразуется в строку false. Булево значение истина преобразуется в строку true.

  • Объект, не принадлежащий к четырем базовым типам преобразуется в строку способом, зависящим от его типа.

Если аргумент отсутствует, он устанавливается по умолчанию как множество узлов, содержащее только контекстный узел.

ЗАМЕЧАНИЕ: Функция string не предназначается для преобразования чисел в строки с целью представления конечному пользователю. Такую функциональность предоставляют функция format-number и элемент xsl:number в [XSLT].

Функция: string concat(string, string, string*)

Функция concat возвращает конкатенацию ее аргументов.

Функция: boolean starts-with(string, string)

Функция starts-with возвращает истину, если первая аргументная строка начинается со второй аргументной строки, иначе она возвращает ложь.

Функция: boolean contains(string, string)

Функция contains возвращает истину, если первая аргументная строка содержит вторую аргументную строку, иначе она возвращает ложь.

Функция: string substring-before(string, string)

Функция substring-before возвращает подстроку первой аргументной строки, которая предшествует первому появлению второй аргументной строки в первой аргументной строке, или пустую строку, если первая аргументная строка не содержит вторую аргументную строку. Например, substring-before("1999/04/01","/") возвращает 1999.

Функция: string substring-after(string, string)

Функция substring-after возвращает подстроку первой аргументной строки, которая следует за первым появлением второй аргументной строки в первой аргументной строке, или пустую строку, если первая аргументная строка не содержит вторую аргументную строку. Например, substring-after("1999/04/01","/") возвращает 04/01, и substring-after("1999/04/01","19") возвращает 99/04/01.

Функция: string substring(string, number, number?)

Функция substring возвращает подстроку первой аргументной строки, начинающуюся с позиции, определенной во втором аргументе и имеющую длину, определенную в третьем аргументе. Например, substring("12345",2,3) возвращает "234". Если третий аргумент отсутствует, функция возвращает подстроку, начинающуюся с позиции, определенной во втором аргументе и продолжающуюся до конца строки. Например, substring("12345",2) возвращает "2345".

Строго говоря, считается, что каждый символ в строке (смотри [3.6 Строки]) имеет числовую позицию: позиция первого символа равна 1, позиция второго символа равна 2 и так далее.

ЗАМЕЧАНИЕ: Это отличается от Java и ECMAScript, в которых метод String.substring считает позицию первого символа равной 0.

Возвращаемая подстрока содержит только те символы, позиция которых больше или равна округленному значению второго аргумента и, если присутствует третий аргумент, меньше суммы округленного значения второго аргумента и округленного значения третьего аргумента; вышеупомянутые операции сравнения и сложения следуют правилам стандарта IEEE 754; округление производится способом, аналогичным вызову функции round. Следующие примеры иллюстрируют различные необычные случаи:

  • substring("12345", 1.5, 2.6) возвращает "234"

  • substring("12345", 0, 3) возвращает "12"

  • substring("12345", 0 div 0, 3) возвращает ""

  • substring("12345", 1, 0 div 0) возвращает ""

  • substring("12345", -42, 1 div 0) возвращает "12345"

  • substring("12345", -1 div 0, 1 div 0) возвращает ""

Функция: number string-length(string?)

Функция string-length возвращает число символов в строке (смотри [3.6 Строки]). Если аргумент отсутствует, он устанавливается по умолчанию значением контекстного узла, преобразованного в строку, другими словами, строковым значением контекстного узла.

Функция: string normalize-space(string?)

Функция normalize-space возвращает аргументную строку с нормализованными пробельными символами посредством удаления лидирующих и замыкающих пробельных символов и замены последовательностей пробельных символов одиночным пробелом. Пробельные символы являются теми же, которые разрешены грамматическим правилом S в XML. Если аргумент отсутствует, он устанавливается по умолчанию значением контекстного узла, преобразованного в строку, другими словами, строковым значением контекстного узла.

Функция: string translate(string, string, string)

Функция translate возвращает первую аргументную строку, в которой все встретившиеся символы второй аргументной строки заменены символами на соответствующих позициях третьей аргументной строки. Например, translate("bar","abc","ABC") возвращает строку BAr. Если во второй аргументной строке существует символ, для которого нет символа с соответсвующим номером позиции в третьей аргументной строке (потому что вторая аргументная строка длинее третьей аргументной строки), тогда экземпляры такого символа в первой аргументной строке удаляются. Например, translate("--aaa--","abc-","ABC") возвращает "AAA". Если некий символ встречается более одного раза во второй аргументной строке, тогда заменяющий символ определяется его первым экземпляром. Если третья аргументная строка длиннее второй аргументной строки, избыточные символы игнорируются.

ЗАМЕЧАНИЕ: Функция translate не является достаточным решением для преобразования регистра во всех языках. Будущие версии XPath могут предоставить дополнительные функции для такого преобразования.

4.3 Булевы функции

Функция: boolean boolean(object)

Функция boolean преобразует ее аргумент в булево значение по следующим правилам:

  • число есть истина только в случае, если оно не является ни положительным или отрицательным нулем, ни NaN

  • множество узлов есть истина только в случае, если оно не пусто

  • строка есть истина только в случае, если она имеет ненулевую длину

  • объект, не принадлежащий ни одному из четырех базовых типов, преобразуется в булево значение способом, зависящим от его типа

Функция: boolean not(boolean)

Функция not возвращает истину, если ее аргумент есть ложь, иначе она возвращает ложь.

Функция: boolean true()

Функция true возвращает истину.

Функция: boolean false()

Функция false возвращает ложь.

Функция: boolean lang(string)

Функция lang возвращает истину или ложь в зависимости от того, является ли язык контекстного узла, заданный атрибутом xml:lang, тем же или подязыком языка, заданного аргументной строкой. Язык контекстного узла определяется значением атрибута xml:lang контекстного узла, или, если контекстный узел не имеет атрибута xml:lang, то значением атрибута xml:lang ближайшего предка контекстного узла, имеющего атрибут xml:lang. Если такого атрибута не существует, функция lang возвращает ложь. Если такой атрибут существует, функция lang возвращает истину, если значение этого атрибута эквивалентно аргументу без учета регистра, или если существует некоторый суффикс, начинающийся с -, такой, что значение атрибута эквивалентно аргументу без учета этого суффикса и без учета регистра. Например, lang("en") вернет истину, если контекстный узел является одним из этих пяти элементов:

<para xml:lang="en"/>
<div xml:lang="en"><para/></div>
<para xml:lang="EN"/>
<para xml:lang="en-us"/>

4.4 Численные функции

Функция: number number(object?)

Функция number преобразует ее аргумент в число по следующим правилам:

  • строка, состоящая из необязательных пробельных символов, за которыми следует необязательный знак минуса, за которым следует Number, сопровождающийся пробельными символами, преобразуется в число IEEE 754, ближайшее (согласно правилу IEEE 754 округления к наиближайшему) к математическому значению, представленному строкой; все другие строки преобразуются в NaN.

  • булево значение истина преобразуется в 1; булево значение ложь преобразуется в 0

  • множество узлов сначала преобразуется в строку способом, аналогичным вызову функции string, а затем полученная строка преобразуется так же, как строковый аргумент

  • объект, не принадлежащий к четырем базовым типам, преобразуется в число способом, зависящим от его типа

Если аргумент отсутствует, он устанавливается по умолчанию как множество узлов, содержащее только контекстный узел.

ЗАМЕЧАНИЕ: Функция number не должна использоваться для преобразования численных данных, встречающихся в элементе XML документа, если только этот элемент не принадлежит типу, который представляет числовые данные в языково-независимом формате (который обычно будет трансформирован в языково-специфичный формат для представления конечному пользователю). Кроме того, функция number не может быть использована, если только языково-независимый формат, использованный элементом, не следует синтаксису XPath для Number.

Функция: number sum(node-set)

Функция sum возвращает сумму результатов преобразований строковых значений всех узлов в аргументном множестве узлов в число.

Функция: number floor(number)

Функция floor возвращает наибольшее (ближайшее к положительной бесконечности) целое число, которое не больше, чем аргумент.

Функция: number ceiling(number)

Функция ceiling возвращает наименьшее (ближайшее к отрицательной бесконечности) целое число, которое не меньше, чем аргумент.

Функция: number round(number)

Функция round возвращает ближайшее к аргументу целое число. Если существует 2 таких числа, то возвращается то из них, которое ближе к положительной бесконечности. Если аргумент есть NaN, то возвращается NaN. Если аргумент есть положительная бесконечность, то возвращается положительная бесконечность. Если аргумент есть отрицательная бесконечность, то возвращается отрицательная бесконечность. Если аргумент есть положительный нуль, возвращается положительный нуль. Если аргумент есть отрицательный нуль, возвращается отрицательный нуль. Если аргумент меньше нуля, но больше или равен -0.5, то возвращается отрицательный нуль.

ЗАМЕЧАНИЕ: Для последних двух случаев, результат вызова функции round не есть тоже самое, что и результат прибавления 0.5 и последующего вызова функции floor.

5 Модель данных

XPath оперирует с XML документом как с деревом. Данный раздел описывает, как XPath моделирует XML документ в виде дерева. Эта модель является только концептуальной и не обязывает ни к чему конкретные реализации. Взаимосвязь этой модели с XML Information Set [XML Infoset] описывается в [B Отображение информационного множества XML].

XML документы, с которыми оперирует XPath обязаны соответствовать Рекомендации XML Namespaces [XML Names].

Дерево содержит узлы. Существует семь типов узлов:

  • корневые узлы

  • узлы элементов

  • текстовые узлы

  • узлы атрибутов

  • узлы пространств имен

  • узлы инструкций по обработке

  • узлы комментариев

Для каждого типа узла существует способ определения строкового значения узла такого типа. Для некоторых типов узлов строковое значение есть часть узла; для других типов узлов строковое значение вычисляется из строковых значений узлов-потомков.

ЗАМЕЧАНИЕ: Для узлов элементов и корневых узлов строковое значение узла не есть тоже самое, что и строка, возвращаемая DOM методом nodeValue (смотри [DOM]).

Некоторые типы узлов также имеют расширенное имя, состоящиее из локальной части и URI пространства имен. Локальная часть есть строка. URI пространства имен есть либо null, либо строка. URI пространства имен, заданный в XML документе, может являться URI ссылкой, как это определено в [RFC2396]; это значит, что он может иметь частичный идентификатор и может быть относительным. Относительный URI должен быть превращен в абсолютный URI во время обработки пространств имен: URI пространств имен расширенных имен узлов в этой модели данных должны быть абсолютными. Два расширенных имени являются эквивалентными, если они имеют идентичные локальные части и, либо оба имеют нулевой URI пространства имен, либо оба имеют идентичные ненулевые URI пространств имен.

Существует порядок, порядок просмотра документа, определенный для всех узлов документа, соответствующий порядку, в котором первый символ XML представления каждого узла появляется в XML представлении документа после раскрытия общих сущностей. Таким образом, корневой узел будет первым узлом. Узлы элементов следуют прежде своих детей. Следовательно, порядок просмотра документа упорядочивает узлы элементов в порядке появления их стартового тэга в XML (после раскрытия сущностей). Узлы атрибутов и узлы пространств имен элемента следуют прежде его детей. Узлам пространств имен определено следовать прежде узлов атрибутов. Порядок следования узлов пространств имен относительно друг друга зависит от реализации. Порядок следования узлов атрибутов относительно друг друга зависит от реализации. Обратный порядок просмотра документа есть противоположность порядка просмотра документа.

Корневые узлы и узлы элементов имеют упорядоченный список дочерних элементов. Узлы никогда не владеют совместно дочерними узлами: если один узел не есть тоже самое, что другой, то ни один дочерний элемент первого узла не будет тем же самым узлом, что и любой дочерний элемент другого узла. Каждый узел, не являющийся корневым узлом, имеет ровно одного родителя, который есть либо узел элемента, либо корневой узел. Корневой узел или узел элемента является родителем всех своих дочерних узлов. Потомками узла являются дочерние узлы этого узла и их потомки.

5.1 Корневой узел

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

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

Корневой узел не имеет расширенного имени.

5.2 Узлы элементов

Существует узел элемента для каждого элемента в документе. Узел элемента имеет расширенное имя, вычисляемое посредством расширения QName элемента, определенного в тэге в соответствии с Рекомендацией XML Namespaces [XML Names]. URI пространства имен расширенного имени элемента будет нулевым, если QName не имеет префикса и не существует подходящего пространства имен по умолчанию.

ЗАМЕЧАНИЕ: В нотации Приложения A.3 [XML Names], локальная часть расширенного имени соответствует атрибуту type элемента ExpEType; URI пространства имен расширенного имени соответствует атрибуту ns элемента ExpEType, и является нулевым, если атрибут ns элемента ExpEType отсутствует.

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

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

5.2.1 Уникальные идентификаторы

Узел элемента может иметь уникальный идентификатор (ID). Это значение атрибута, который объявлен в DTD принадлежащим к типу ID. Никакие два элемента в документе не могут иметь один и тот же уникальный ID. Если XML процессор сообщает о том, что два элемента в документе имеют один и тот же уникальный ID (что возможно в случае, если документ некорректен), то второй элемент в порядке просмотра документа рассматривается как не имеющий уникального ID.

ЗАМЕЧАНИЕ: Если документ не имеет DTD, то ни один элемент в документе не будет иметь уникального ID.

5.3 Узлы атрибутов

Каждый узел элемента имеет ассоциированное с ним множество узлов атрибутов; элемент является родителем каждого из этих узлов атрибутов; однако, узел атрибута не является дочерним узлом его родительского элемента.

ЗАМЕЧАНИЕ: Это отличается от DOM, где элемент, несущий атрибут, не рассматривается в качестве родителя этого атрибута (смотри [DOM]).

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

ЗАМЕЧАНИЕ: Оператор = проверяет, имеют ли два узла одно и тоже значение, а не являются ли они одним и тем же узлом. Таким образом, атрибуты двух различных узлов можно сравнивать на равенство, используя = даже не смотря на то, что они не являются одним и тем же узлом.

Атрибуты по умолчанию обрабатываются также, как и атрибуты, определенные явным образом. Если атрибут для элемента был определен в DTD, но значение по умолчанию для этого атрибута было объявлено как #IMPLIED и этот атрибут отсутствует в элементе, тогда множество атрибутов такого элемента не содержит узла, соответствующего этому атрибуту.

Некоторые атрибуты, такие как xml:lang и xml:space имеют собственную семантику, которая распространяется на все элементы, являющиеся потомками элемента, содержащего такой атрибут, если только она не перекрывается экземпляром такого же атрибута в одном из элементов-потомков. Однако, это не влияет на то, где располагаются атрибуты в дереве: элемент имеет узлы атрибутов соответствующие только атрибутам, которые были явно определены в стартовом тэге или тэге пустого элемента или которые были явно объявлены в DTD со значением по умолчанию.

Узел атрибута имеет расширенное имя и строковое значение. Расширенное имя вычисляется посредством расширения QName, определенного в тэге в XML документе, согласно Рекомендации XML Namespaces [XML Names]. URI пространства имен имени атрибута будет нулевым, если QName атрибута не имеет префикса.

ЗАМЕЧАНИЕ: В терминах Приложения A.3 [XML Names], локальная часть расширенного имени соответствует атрибуту name элемента ExpAName; URI пространства имен расширенного имени соответствует атрибуту ns элемента ExpAName, и является нулевым, если атрибут ns элемента ExpAName отсутствует.

Узел атрибута имеет строковое значение. Строковое значение является нормализованным согласно XML Рекомендации [XML] значением. Атрибут, нормализованное значение которого есть строка нулевой длины, не рассматривается как нечто особенное: это приводит к тому, что такой узел атрибута имеет в качестве строкового значения строку нулевой длины.

ЗАМЕЧАНИЕ: Существует возможность объявить атрибуты по умолчанию во внешнем DTD или во внешней сущности параметра. XML Рекомендация не требует от XML процессора считывать внешние DTD или внешние параметры, если только он не является проверяющим. Таблица стилей или другие средства, подразумевающие, что XPath дерево содержит значения атрибутов по умолчанию, опреденные во внешнем DTD или сущности параметра, могут не работать с некоторыми непроверяющими XML процессорами.

Для атрибутов, декларирующих пространства имен (смотри [XML Names]), не существует соответствующих им узлов атрибутов.

5.4 Узлы пространств имен

Каждый элемент имеет ассоциированное с ним множество узлов пространств имен, один узел для каждого отдельного префикса пространства имен, находящегося в области видимости элемента (включая префикс xml, который неявно объявлен в Рекомендации XML Namespaces [XML Names]) и один узел для пространства имен по умолчанию, если такое существует в области видимости элемента. Элемент является родителем каждого из этих узлов пространств имен; однако узлы пространств имен не являются дочерними узлами их родительского элемента. Элементы никогда не владеют совместно узлами пространств имен: если один узел элемента не является тем же, что и второй узел элемента, то ни один из узлов пространств имен первого узла элемента не будет тем же самым узлом, что и любой узел пространств имен другого узла элемента. Это означает, что элемент будет иметь узел пространства имен:

  • для каждого своего атрибута, чье имя начинается с xmlns:;

  • для каждого атрибута элемента-предка, чье имя начинается с xmlns:, если только сам элемент или более ближний предок не редекларирует префикс;

  • для атрибута xmlns, если элемент или какой-либо его предок имеет атрибут xmlns и значение атрибута xmlns ближайшего такого элемента не пусто.

    ЗАМЕЧАНИЕ: Атрибут xmlns="" "передекларирует" пространство имен по умолчанию (смотри [XML Names]).

Узел пространства имен имеет расширенное имя: локальная его часть есть префикс пространства имен (он пуст, если узел пространства имен соответствует пространству имен по умолчанию); URI пространства имен всегда нулевой.

Строковое значение узла пространства имен есть URI пространства имен, связанный с префиксом пространства имен; если URI является относительным, он должен быть преобразован аналогично URI пространства имен расширенного имени.

5.5 Узлы инструкций по обработке

Существует узел инструкции по обработке для каждой инструкции по обработке, исключая любые инструкции по обработке, содержащиеся в декларации типа документа.

Инструкция по обработке имеет расширенное имя: локальная его часть есть адресат инструкции по обработке; URI пространства имен является нулевым. Строковое значение узла инструкции по обработке есть часть инструкции по обработке, следующая за адресатом и любыми пробельными символами. Сюда не включается завершающие символы ?>.

ЗАМЕЧАНИЕ: Декларация XML не является инструкцией по обработке. Таким образом, не существует узла инструкции по обработке, соответствующего декларации XML.

5.6 Узлы комментариев

Существует узел комментария для каждого комментария, исключая любые комментарии, содержащиеся в декларации типа документа.

Строковое значение узла комментария есть содержимое комментария, не включая открывающие символы <!-- и закрывающие символы -->.

Узел комментария не имеет расширенного имени.

5.7 Текстовые узлы

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

Каждый символ в CDATA секции рассматривается как символьные данные. Таким образом, <![CDATA[<]]> в исходном документе будет рассматриваться аналогично &lt;, что в обоих случаях приведет к появлению одиночного символа < в текстовом узле дерева. Таким образом, секция CDATA рассматривается как если бы были удалены символы <![CDATA[ и ]]>, и все экземпляры < и & были заменены на &lt; и &amp; соответственно.

ЗАМЕЧАНИЕ: Когда текстовый узел, содержащий символ <, выводится в виде XML, символ < должен быть представлен в виде ссылки, например, с помощью &lt; или путем заключения его в секцию CDATA.

Символы, содержащиеся внутри комментариев, инструкций по обработке, и значений атрибутов не производят текстовых узлов. Концы строк во внешних сущностях нормализуются в #xA, как определено в XML Рекомендации [XML].

Текстовый узел не имеет расширенного имени.

6 Соответствие

XPath предназначен главным образом служить в роли компонента, который может использоваться другими спецификациями. Следовательно, XPath доверяет спецификациям, которые используют XPath (таким, как [XPointer] и [XSLT]), определять критерии соответствия реализаций XPath и не определяет никаких критериев соответствия для независимых реализаций XPath.

A Ссылки

A.1 Нормативные ссылки

IEEE 754
Institute of Electrical and Electronics Engineers. IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std 754-1985.
RFC2396
T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC 2396. See http://www.ietf.org/rfc/rfc2396.txt.
XML
World Wide Web Consortium. Extensible Markup Language (XML) 1.0. W3C Recommendation. See http://www.w3.org/TR/1998/REC-xml-19980210
XML Names
World Wide Web Consortium. Namespaces in XML. W3C Recommendation. See http://www.w3.org/TR/REC-xml-names

A.2 Другие ссылки

Character Model
World Wide Web Consortium. Character Model for the World Wide Web. W3C Working Draft. See http://www.w3.org/TR/WD-charmod
DOM
World Wide Web Consortium. Document Object Model (DOM) Level 1 Specification. W3C Recommendation. See http://www.w3.org/TR/REC-DOM-Level-1
JLS
J. Gosling, B. Joy, and G. Steele. The Java Language Specification. See http://java.sun.com/docs/books/jls/index.html.
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. International Standard. See http://www.iso.ch/cate/d18741.html.
TEI
C.M. Sperberg-McQueen, L. Burnard Guidelines for Electronic Text Encoding and Interchange. See http://etext.virginia.edu/TEI.html.
Unicode
Unicode Consortium. The Unicode Standard. See http://www.unicode.org/unicode/standard/standard.html.
XML Infoset
World Wide Web Consortium. XML Information Set. W3C Working Draft. See http://www.w3.org/TR/xml-infoset
XPointer
World Wide Web Consortium. XML Pointer Language (XPointer). W3C Working Draft. See http://www.w3.org/TR/WD-xptr
XQL
J. Robie, J. Lapp, D. Schach. XML Query Language (XQL). See http://www.w3.org/TandS/QL/QL98/pp/xql.html
XSLT
World Wide Web Consortium. XSL Transformations (XSLT). W3C Recommendation. See http://www.w3.org/TR/xslt

B Отображение информационного множества XML (ненормативная часть)

Узлы в модели данных XPath могут быть произведены от информационных единиц, определенных в XML Information Set [XML Infoset] следующим образом:

ЗАМЕЧАНИЕ: Новая версия XML Information Set Working Draft, которая должна заменить версию от 17 мая, была близка к завершению во время окончания подготовки этой версии XPath и как ожидалось, должна была быть выпущена одновременно или вскоре после выпуска этой версии XPath. Данное отображение дается для этой новой версии XML Information Set Working Draft. Если новая версия XML Information Set Working все еще не выпущена, члены W3C могут обратиться к внутренней версии Рабочей Группы http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html (только для членов ).

  • Корневой узел происходит от информационной единицы документа. Дети корневого узла происходят от свойств children и children - comments.

  • Узел элемента происходит от информационной единицы-элемента. Дочерние узлы узла элемента происходят от свойств children и children - comments. Атрибуты узла элемента происходят от свойства attributes. Узлы пространств имен узла элемента происходят от свойства in-scope namespaces. Локальная часть расширенного имени узла элемента происходит от свойства local name. URI пространства имен расширенного имени узла элемента происходит от свойства namespace URI. Уникальный ID узла элемента происходит от свойства children информационной единицы-атрибута, который имеет в свойстве attributes свойство attribute type, эквивалентное ID.

  • Узел атрибута происходит от информационной единицы-атрибута. Локальная часть расширенного имени узла атрибута происходит от свойства local name. URI пространства имен расширенного имени узла атрибута происходит от свойства namespace URI. Строковое значение такого узла происходит от конкатенации свойств character code каждого члена свойства children.

  • Текстовый узел происходит от последовательности одной или более символьных информационных единиц. Строковое значение такого узла происходит от конкатенации свойств character code каждой символьной информационной единицы.

  • Узел инструкции по обработке происходит от информационной единицы-инструкции по обработке. Локальная часть расширенного имени такого узла происходит от свойства target. (Часть расширенного имени, соответствующая URI пространства имен, для такого узла является нулевой). Строковое значение такого узла происходит от свойства content. Для единиц-инструкций по обработке, являющихся детьми информационной единицы-декларации типа документа, не существует узлов инструкций по обработке.

  • Узел комментария происходит от информационной единицы-комментария. Строковое значение такого узла происходит от свойства content. Для информационных единиц-комментариев, являющихся детьми информационной единицы-декларации типа документа, не существует узлов комментариев.

  • Узел пространства имен происходит от информационной единицы-декларации пространства имен. Локальная часть расширенного имени такого узла происходит от свойства prefix. (Часть расширенного имени, соответствующая URI пространства имен, для такого узла является нулевой.) Строковое значение такого узла происходит от свойства namespace URI.

C Словарь перевода терминов (приложение переводчика)

location path
путь выборки
location step
шаг выборки
axis
ось навигации
node test
тест узла
node set
множество узлов
root node
корневой узел
element node
узел элемента
attribute node
узел атрибута
namespace node
узел пространства имен
processing instruction node
узел инструкции по обработке
comment node
узел комментария
text node
текстовый узел
document element
элемент-документ
expanded-name
расширенное имя
string-value
строковое значение
context position
позиция контекста
context size
размер контекста
variable binding
связанная переменная
document order
порядок просмотра документа