>[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-документов был более наглядным, в листингах он будет форматироваться с пробельными отступами, например:
>
>
>
Еще раз повторим, что это форматирование применяется только в целях наглядности исходного кода, когда это не противоречит смыслу документа. В предыдущем случае документ на самом деле мог выглядеть как:
>
В тех случаях, когда позиции пробельных символов документа важны для повествования, они будут особым образом выделяться. Для обозначения пробела мы будем использовать символ ">□
", а для обозначения символа переноса строки — символ ">¶
", например:
><а xmlns:d="urn:d">¶
>□□¶
>□□□□<с>¶
>□□□□□□¶
>□□□□□□¶
>□□□□с>¶
>□□¶
>а>
Базовые понятия или моменты, на которые следует обратить повышенное внимание, выделяются в тексте курсивом. Иностранные аббревиатуры и термины расшифровываются и переводятся в скобках, например: XSLT (от англ. extensible Stylesheet Language for Transformations — расширяемый язык стилей для преобразований). Ссылки на другие книги берутся в квадратные скобки с указанием года издания, например, [Кнут 2001]. Более точные библиографические данные можно найти в списке литературы.