Чтение онлайн

на главную - закладки

Жанры

Технология XSLT

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

Шрифт:

□ 

'строка'
— соответствует строке, которая приведена в одинарных кавычках. Например,
'template'
соответствует строке
template
.

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

□ 

A?
означает, что выражение
A
необязательно и может быть пропущено.

□ 

A | B
соответствует либо выражению
A
, либо выражению
B
, но не им обоим одновременно (строгое "или"). Выражения
такого вида называют иначе выбором.

□ 

A B
означает, что за выражением
A
следует выражение
B
. Последовательность имеет приоритет по сравнению с выбором —
A B | C D
означает последовательность выражений
A
и
B
или последовательность выражений
C
и
D
.

□ 

A - B
соответствует строке, которая соответствует выражению
A
, но не выражению
B
.

□ 

A+
означает последовательность из одного или более выражения
A
. Оператор "
+
" в EBNF старше оператора выбора,
A+ | B+
означает последовательность из одного или более выражения
A
или последовательность из одного или более выражения
B
.

□ 

A*
означает последовательность из нуля или более выражений
A
. Аналогично оператору "
+
", оператор "
*
" старше оператора выбора

□ 

(выражение)
— круглые скобки используются для группировки выражений. Выражения, заключенные в скобки, рассматриваются, как отдельная единица, которая может быть свободно использована в приведенных выше конструкциях. Например, выражение
A B C | B C | A D C | D C | C
можно переписать в виде
(A? (B | D) ) C
.

Нотация расширенных форм Бэкуса-Наура может с первого взгляда показаться очень сложной, однако, на самом деле это не так. Достаточно разобрать несколько примеров, как все встанет на свои места.

Пример

Рассмотрим реальную продукцию

Digits
языка XPath.
Digits
— это последовательность из нескольких цифр от
0
до
9
и определяется она следующим образом:

Digits ::= [0-9] +

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

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

При помощи продукции Digits определяется такая продукция, как Number, которая соответствует числу. Число — это последовательность цифр, разделенная точкой на целую и дробную части:

[30] Number ::= Digits ('.' Digits?)?

| '.' Digits

Чтобы лучше понять EBNF, попробуем немного упростить эту продукцию. Выражение

Digits?
внутри круглых скобок означает, что
Digits
может как присутствовать, так и быть
опущенным, то есть
('.' Digits?) ?
равносильно
'.' ? | ('.' Digits)?
. Повторяя еще раз подобное упрощение с каждым из полученных выражений, в итоге преобразуем правило
Number
к виду:

Number ::= Digits

| Digits '.' Digits

| Digits '.'

| '.' Digits

Следовательно, число имеет четыре варианта синтаксиса:

□ последовательность цифр, например

12345
;

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

3.14
;

□ последовательность цифр, заканчивающаяся точкой, например

6.
— что эквивалентно
6.0
;

□ последовательность цифр, начинающаяся точкой, например

.5
, что эквивалентно
0.5
.

Разберем еще одну продукцию языка XPath — определение литерала. Литерал в XPath — это последовательность символов, заключаемая в одинарные или двойные кавычки, которая используется в качестве строкового параметра в функциях и т.д. Единственным и вполне логичным ограничением на синтаксис литерала является то, что он не может содержать символ собственных кавычек — в этом случае непонятно, где же на самом деле литерал кончается, а где начинается (например,

'ab'cd'
).

Конструкция

Literal
задается следующим образом:

[29] Literal ::= '"' [^"]* '"'

| "'" [^']* "'"

В первом случае синтаксис литерала начинается двойными кавычками (

'"'
), затем идет последовательность, состоящая из любых символов, кроме двойных кавычек (
[^"]*
), затем закрывающие двойные кавычки (
'"'
). Во втором случае синтаксис имеет точно такой же вид с точностью до замены одинарных кавычек двойными и наоборот.

Другим очень часто используемым правилом является правило, определяющее пробельное пространство (англ. space или whitespace). Пробельными символами в XML-языках считаются такие символы, как табуляция, перевод строки, возврат каретки и сам пробел. Продукция

S
пробельного пространства задается, как последовательность из одного или более пробельного символа:

[3] S ::= (#х20 | #х9 | #xD | #хА)+

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

Обозначения

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

Прежде всего, код программ и текст XML-документов будет выделяться моноширинным шрифтом

Courier
. Листингам многих примеров будут предшествовать заголовки вида

Листинг 2.1. Входящий документ

<!-- Текст входящего документа -->

Для того чтобы текст XML-документов был более наглядным, в листингах он будет форматироваться с пробельными отступами, например:

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

Скандальная свадьба

Данич Дина
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Скандальная свадьба

Орден Багровой бури. Книга 5

Ермоленков Алексей
5. Орден Багровой бури
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Орден Багровой бури. Книга 5

Адвокат Империи 7

Карелин Сергей Витальевич
7. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 7

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Вспоминай меня ночью

Рам Янка
Любовные романы:
современные любовные романы
эро литература
5.60
рейтинг книги
Вспоминай меня ночью

Адвокат вольного города 3

Кулабухов Тимофей
3. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 3

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Адвокат вольного города 4

Кулабухов Тимофей
4. Адвокат
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Адвокат вольного города 4

Земная жена на экспорт

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Земная жена на экспорт

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Баронесса. Эхо забытой цивилизации

Верескова Дарья
1. Проект «Фронтир Вита»
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Баронесса. Эхо забытой цивилизации

Неудержимый. Книга XVII

Боярский Андрей
17. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVII

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений