|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3 Выражения3.1 ОсновыVariableReference заменяется значением, которое в текущем контексте поставлено в соответствие данному имени переменной (согласно схеме привязки переменных контекста). Если же по схеме привязки переменных контекста с данным именем переменной не связано ни одно значение, фиксируется ошибка. Для группировки выражений могут использоваться круглые скобки.
3.2 Вызовы функцийПри обработке выражения FunctionCall используется FunctionName, позволяющее функцию в выражении сопоставить с библиотекой функций, соответствующей контексту обрабатываемого выражения, обработать каждый из аргументов, приведя к тому типу, который необходим для этой функции, и наконец вызвать саму функцию, передав ей преобразованные аргументы. Если указано неправильное количество аргументов или какой-либо аргумент не может быть приведен к требуемому типу, фиксируется ошибка. Результатом обработки выражения FunctionCall будет результат, возвращаемый соответствующей функцией. Приведение аргумента к типу string осуществляется как при вызове функции string. Приведение к типу number осуществляется как при вызове функции number. Приведение к типу boolean осуществляется как при вызове функции boolean. Аргумент, тип которого не соответствует набору узлов, уже не может быть приведен к этому типу.
3.3 Наборы узловВ качестве выражения может использоваться путь адресации. Результатом обработки такого выражения будет набор узлов, отобранных согласно указанному пути адресации. Оператор Точно так же, как и в случае с путями адресации, для фильтрации выражений могут использоваться предикаты. Однако если результатом обработки выражения, подлежащего фильтрации, будет не набор узлов, фиксируется ошибка. Указанный предикат осуществляет фильтрацию набора узлов относительно оси child. Замечание: Значение предиката решающим образом зависит от используемой оси. Например, Операторы Не существует таких типов объектов, которые можно было бы преобразовать в набор узлов.
3.4 Булевы значенияОбъект типа boolean может иметь два значения: true и false. Обработка выражения Обработка выражения Обработка EqualityExpr (который содержит не только RelationalExpr) или RelationalExpr (который содержит не только AdditiveExpr) сводится к сравнению объектов, полученных в результате обработки обоих операндов. Процедура сравнения объектов описывается в трех следующих параграфах. В первом параграфе сравнение наборов узлов определяется через сравнение более элементарных объектов. Это в равной степени относится к Если оба сравниваемых объекта являются наборами узлов, то их сравнение будет иметь результатом true тогда и только тогда, когда и в первом и во втором наборах имеются узлы, такие что в результате сравнения строковых значений этих двух узлов имеем true. Если одним из сравниваемых объектов является набор узлов, а вторым - число, то их сравнение будет иметь результатом true тогда и только тогда, когда в представленном наборе имеется такой узел, что сравнение его строкового значения, преобразованного в число с помощью функции number, со вторым операндом даст в результате true. Если одним из сравниваемых объектов является набор узлов, а вторым строка, то в результате их сравнения true будет получаться тогда и только тогда, когда в наборе имеется такой узел, что результатом сравнения строкового значения этого узла со второй представленной строки будет true. Если одним из сравниваемых объектов является набор узлов, а вторым булево значение, то в результате их сравнения true будет получено тогда и только тогда, когда сравнение представленного булевого значения с результатом приведения набора узлов к булевому значению с помощью функции boolean также даст true. Если ни один из объектов, подлежащих сравнению, не является набором узлов, а оператором является Замечание: Если Если ни один из подлежащих сравнению объектов не является набором узлов, а оператором является Замечание: Если в XML документе встречается выражение XPath, то операторы
Замечание: Согласно представленной выше грамматике, операторы будут иметь следующий порядок приоритета (наименьший приоритет идет первым): 3.5 ЧислаЧисло в XPath имеет представление с плавающей точкой. Число может принимать любое значение в 64-битном формате IEEE 754 двойной точности [IEEE 754]. Сюда включены специальное значение "Not-a-Number" (NaN), положительная и отрицательная бесконечности, а также положительный и отрицательный нули. Список основных правил стандарта IEEE 754 см. в главе 4.2.3 документа [JLS] Операнды для числовых операторов преобразуются в числа как при вызове функции number. Оператор Оператор Замечание: поскольку язык XML допускает использование в именах символа Оператор Оператор
Замечание: Указанный оператор аналогичен оператору
Замечание: Данный оператор отличается от оператора remainder из IEEE 754, который возвращает остаток округляющего деления. Числовые выражения
3.6 СтрокиСтроки образуются последовательностью из нуля и более символов, определенных в Рекомендации XML [XML]. Следовательно, в XPath каждый символ соответствует единственному абстрактному символу Unicode с единственным соответствующим скалярным значением Unicode (см. [Unicode]). Это не то же самое, что 16-битное значение кода Unicode, когда абстрактный символ со скалярным значением, большим чем U+FFFF, представляется в кодировке Unicode парой 16-битных значений (суррогатной парой). Во многих языках программирования строка представляется в виде последовательности 16-битных значений кодировки Unicode. Реализация XPath с помощью таких языков должна гарантировать, что каждая суррогатная пара обрабатывается именно как один символ XPath. Замечание: В кодировке Unicode две строки могут считаться идентичными даже несмотря на то, что они образованы различными последовательностями абстрактных символов Unicode. Например, некоторые ударные символы могут быть представлены как в собранном (precompressed), так и в разобранном (decompressed) виде. Поэтому выражения XPath могут дать неожиданный результат, если такие символы в XPath выражении и в XML документе не были нормализованы в каноническую форму. См. документ [Character Model]. 3.7 Лексическая структураВ результате лексического анализа всегда возвращается самая длинная из возможных лексем. Для большего удобства чтения в выражения могут быть вставлены пробельные символы, даже если грамматика и не содержит на то явных указаний: в шаблонах перед любым ExprToken и после него всегда можно свободно поставить ExprWhitespace. Чтобы устранить указанную неоднозначность грамматики ExprToken, должны применяться следующие специальные правила лексического анализа:
Лексическая структура выражения
Назад | Содержание | Вперед
|
|
CITForum © 1997–2025