Вход/Регистрация
Технология XSLT
вернуться

Валиков Алексей Н.

Шрифт:

[XP29] Literal ::= '"' [^"]* '"' | "'" [^']* "'"

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

Digits
, могут состоять из цифр от
0
до
9
:

[XP31] Digits ::= [0-9]+

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

.5
), так и в конце (
5.
). Числу соответствует EBNF-правило
Number
:

[XP30] Number ::= Digits ('.' Digits?)? | '.' Digits

Оператору умножения соответствует символ "

*
" и синтаксическое правило
MultiplyOperator
:

[XP34] MultiplyOperator ::= '*'

Именам переменных, которые используются в XPath, предшествует символ "

$
". Сами же имена должны удовлетворять продукции
QName
, которую мы рассматривали в разделе "Расширенные имена".

[XP36] VariableReference ::= '$' QName

Продукция

NodeType
, использованная в тесте узла (см. раздел "Тесты узлов" данной главы, продукция
[XP7]
), определяет типы узлов, которые можно проверить при тесте —
comment
(комментарий),
text
(текстовый узел),
processing-instruction
(узел инструкции по обработке) и
node
(узел любого типа).
NodeType
записывается следующим образом:

[XP38] NodeType ::= 'comment'

| 'text'

| 'processing-instruction'

| 'node'

Другая конструкция,

NameTest
, которая также используется в тесте узла, проверяет узлы базового типа оси на соответствие определенному имени. EBNF-правило
NameTest
имеет следующий синтаксис:

[ХР37] NameTest ::= '*' | NCName ':' '*' | QName

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

FunctionName
имеет вид:

[XP35] FunctionName ::= QName - NodeType

В целях удобочитаемости, в выражениях можно использовать пробельное пространство. Ему соответствует EBNF-правило

ExprWhiteSpace
:

[XP39] ExprWhitespace ::= S

Разбор 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
.

  • Читать дальше
  • 1
  • ...
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: