Книга: Технология XSLT

Разбор XPath-выражений

Разбор XPath-выражений

Хотя синтаксис языка XPath укладывается в тридцать с небольшим синтаксических правил, реализация интерпретатора XPath-выражений может быть довольно непростой задачей. Для того чтобы хоть как-то упростить ее, в XPath определяются так называемые токены выражения (англ. expression token). Токены — это единицы, из которых состоит выражение. Будучи сами очень простыми, они выстраиваются в более сложные конструкции, образуя, в итоге, выражения.

Примером токенов являются операторы, которым соответствуют продукции Operator и OperatorName:

[XP33] OperatorName ::= 'and' | 'or' | 'mod* | 'div'
[XP32] Operator     ::= OperatorName
                        | MultiplyOperator
                        | '/' | '//' | '|' | '+' | '-'
                        | '=' | '!=' | '<' | '>' | '<=' | '>='

Продукция самого токена выражения имеет вид:

[ХР28] ExprToken ::= '(' | ')' | '[' | ']'
                     | ' . ' | ' .. ' | '@' | ' | ':: '
                     | NameTest
                     | NodeType
                     | Operator
                     | FunctionName
                     | AxisName
                     | Literal
                     | Number
                     | VariableReference

При разборе XPath-выражения оно сначала разбивается на отдельные токены, а затем из них организуются более сложные структуры. При разбивке выражения на отдельные токены, следует всегда выбирать токен с самым длинным строковым представлением.

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

? Если текущему токену предшествует другой токен, причем этот предшествующий токен не является символом @, ::, (, [ или нетерминалом Operator, то текущий токен, являющийся символом *, должен восприниматься как знак умножения, а токен, являющийся NCName, — как нетерминал OperatorName.

? Если за текущим токеном вида NCName следует открывающая круглая скобка (символ "("), токен должен восприниматься или как имя функции (FunctionName), или как тип узла (NodeType).

? Если за текущим токеном вида NCName следуют символы "::", токен должен восприниматься как имя оси навигации (AxisName).

? Если ничего из вышеперечисленного не выполняется, токен не должен восприниматься, как MultiplyOperator, OperatorName, NodeType, FunctionName или AxisName.

Мы привели эти правила в точности так, как они описаны в спецификации языка XPath. Их довольно непросто понять в такой формулировке, поэтому мы попытаемся объяснить их другими словами.

? Символ * является знаком умножения (MultiplyOperator) тогда и только тогда, когда ему предшествует токен, но этот токен не является токеном @, ::, (, [ или Operator.

? Токен NCName представляет имя оператора (OperatorName) тогда и только тогда, когда ему предшествует токен, но этот токен не является токеном ::, (, [ или Operator.

? Токен NCName является именем функции (FunctionName) или типом узла (NodeType) тогда и только тогда, когда за ним следует символ "(".

? Токен NCName является именем оси навигации (AxisName) тогда и только тогда, когда за ним следуют символы "::".

Оглавление книги

Оглавление статьи/книги

Генерация: 1.396. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз