| '.' Digits
Чтобы лучше понять EBNF, попробуем немного упростить эту продукцию. Выражение Digits?
внутри круглых скобок означает, что Digits
может как присутствовать, так и быть опущенным, то есть ('.' Digits?) ?
равносильно '.' ? | ('.' Digits)?
. Повторяя еще раз подобное упрощение с каждым из полученных выражений, в итоге преобразуем правило Number
к виду:
Number ::= Digits
| Digits '.' Digits
| Digits '.'
| '.' Digits
Следовательно, число имеет четыре варианта синтаксиса:
□ последовательность цифр, например 12345
;
□ последовательность цифр, разделенная точкой на целую и дробную части, например 3.14
;
□ последовательность цифр, заканчивающаяся точкой, например 6.
— что эквивалентно 6.0
;
□ последовательность цифр, начинающаяся точкой, например .5
, что эквивалентно 0.5
.
Разберем еще одну продукцию языка XPath — определение 'ab'cd'
).
Конструкция Literal
задается следующим образом:
[29] Literal ::= ''' [^']* '''
| ''' [^']* '''
В первом случае синтаксис литерала начинается двойными кавычками ('''
), затем идет последовательность, состоящая из любых символов, кроме двойных кавычек ([^']*
), затем закрывающие двойные кавычки ('''
). Во втором случае синтаксис имеет точно такой же вид с точностью до замены одинарных кавычек двойными и наоборот.
Другим очень часто используемым правилом является правило, определяющее пробельное пространство (англ. space или whitespace). Пробельными символами в XML-языках считаются такие символы, как табуляция, перевод строки, возврат каретки и сам пробел. Продукция S
пробельного пространства задается, как последовательность из одного или более пробельного символа:
[3] S ::= (#х20 | #х9 | #xD | #хА)+
Как правило, EBNF-продукции языков XML-группы составлены довольно просто, но в некоторых случаях они разбиты на несколько правил, которые определены в разных частях спецификации. В таких случаях мы будем по возможности упрощать продукции, записывая их в раскрытом виде.
Обозначения
Для того чтобы текст книги был более понятен, мы будем использовать некоторые соглашения.
Прежде всего, код программ и текст XML-документов будет выделяться моноширинным шрифтом Courier
. Листингам многих примеров будут предшествовать заголовки вида
<!-- Текст входящего документа -->
Для того чтобы текст XML-документов был более наглядным, в листингах он будет форматироваться с пробельными отступами, например:
<foo bar='1'>
<FOO/>
</foo>
Еще раз повторим, что это форматирование применяется только в целях наглядности исходного кода, когда это не противоречит смыслу документа. В предыдущем случае документ на самом деле мог выглядеть как:
<?xml version='1.0' encoding='UTF-8'?><foo bar='1'><FOO></foo>
В тех случаях, когда позиции пробельных символов документа важны для повествования, они будут особым образом выделяться. Для обозначения пробела мы будем использовать символ '□
', а для обозначения символа переноса строки — символ '¶
', например:
<а xmlns:d='urn:d'>¶
□□<d:b>¶
□□□□<с>¶
□□□□□□<e>¶
□□□□□□</e>¶
□□□□</с>¶
□□</d:b>¶
</а>
Базовые понятия или моменты, на которые следует обратить повышенное внимание, выделяются в тексте
Благодарности
Прежде всего, хотелось бы выразить признательность группе Систем Баз Данных (DBS) Исследовательского Центра Информатики (Forschungszentrum Informatik, FZI) при университете г. Карлсруэ, где мне посчастливилось работать. Эта книга написана главным образом благодаря практическому опыту, полученному во множестве проектов Европейской Комиссии, которыми занимается наш центр.
Эта книга не состоялась бы без участия Майкла Кея (разработчика XSLT-процессора Saxon и редактора новой версии языка XSLT), Стива Мюнха (руководителя XML-проектов Oracle), Кена Холлмана (Crane Softwrights Ltd.), Олега Ткаченко (MultiConn International Ltd.) и многих других людей, которые советами и конкретными примерами помогали готовить этот непростой материал.
Отдельной благодарностью хочется упомянуть всех участников конференций fido7.ru.xml, comp.text.xml и списка рассылки XSL List, которые своими вопросами подсказывали, какие проблемы интересуют XSLT-разработчиков на практике. Большинство примеров, которые приводятся в этой книге, были ответами на вопросы участников конференций.
Большое спасибо моим научным руководителям — профессору Н.И. Юсуповой и профессору П.X. Локеману, за мудрые слова и внимание, которое они мне уделяли.
Выражаю признательность также сотрудникам издательства 'БХВ-Петербург': Евгению Рыбакову, Анне Кузьминой и Леониду Кочину — за помощь при подготовке книги к печати.