- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Технология XSLT - Алексей Валиков
Шрифт:
Интервал:
Закладка:
Выражение ('[' (markupdecl | DeclSep) * ']' S?) ? в продукции doctypedecl означает, что в декларации типа документа в квадратных скобках может содержаться последовательность нетерминалов markupdecl и DeclSep.
Первый из этих нетерминалов, markupdecl, показывает, определения какого вида содержатся в DTD:
[29] markupdecl ::= elementdecl
| AttlistDecl
| EntityDecl
| NotationDecl
| PI
| Comment
С правилами PI и Comment мы уже знакомы — в данной продукции они показывают, что в DTD также можно использовать инструкции по обработке и комментарии.
Нетерминалы elementdecl, AttlistDecl, EntityDecl и NotationDecl соответствуют определениям элемента, списка атрибутов, сущности и нотации. Они будут подробно разобраны в следующих четырех разделах.
Нетерминал DeclSep соответствует разделителю объявлений, которые перечисляются в DTD. Этот разделитель может быть либо пробельным пространством, либо параметризованной сущностью:
[28а] DeclSep ::= PEReference | S
В случае, если определения в DTD разделяются сущностью-параметром, ее содержимое интерпретируется как обычные определения вида markupdecl.
Определение элемента
Определение элемента задает имя и тип содержимого элемента в следующем виде:
<!ELEMENT имя содержимое>
Имя элемента должно начинаться с буквы, подчеркивания ("_") или двоеточия (":") и содержать буквы, цифры, некоторые знаки пунктуации (такие, как "_" — подчеркивание, ":" — двоеточие, "." — точка, "-" — тире или знак минуса) и модифицирующие символы (см. разд. "Базовые продукции ХМL" данной главы).
Примером имени элемента может быть "A", "B:12", "MyEasyName", "doc.xml".
В качестве содержимого элемента может быть указано:
□ EMPTY, в случае, когда элемент обязан быть пустым;
□ ANY, в случае, когда элемент может содержать что угодно;
□ формальное правило, определяющее элементы, и данные, которые может содержать элемент, а также порядок их следования.
Первые два случая определения элемента довольно просты. Их использование может быть продемонстрировано на следующем примере:
Декларация
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
определяет документ с корневым элементом advert, в котором могут встречаться также элементы product и classified, причем элементы advert и product могут содержать любые данные и любые из объявленных элементов, а элемент classified всегда должен быть пустым.
Приведем пример документа, построенного в соответствии с этой декларацией.
Листинг 1.3. Документ с декларацией типа<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
<advert>
<product>
Покупайте наших слонов!
</product>
<classified/>
</advert>
В третьем случае содержимое элемента определяется при помощи формальных правил, которые очень похожи на те, которые используются в расширенных формах Бэкуса-Наура. Подобно тому, как в EBNF формальные правила используются для того, чтобы стандартизировать последовательность символов, составляющую конструкции некоторого языка, в определениях элементов они используются для описания содержимого элемента — последовательности из символьных данных и дочерних элементов.
Количество, с которым элемент может появляться в этой последовательности, формально записывается с использованием символов-модификаторов "*", "?", "+", которые имеют следующие значения:
□ а? — означает, что элемент а может быть пропущен в последовательности;
□ а — означает, что элемент а должен присутствовать в последовательности на этом месте ровно один раз;
□ а* — задает последовательность из нуля или более элементов а;
□ a+ — задает последовательность из одного или более элементов а.
Кроме того, содержимое может моделироваться как перечисление и выбор элементов.
Элементы перечисляются через запятую в круглых скобках, например (a, b, c) — это последовательность, состоящая из элементов a, b, c. Такая запись означает, что первым должен идти элемент a, затем сразу же за ним элемент b и элемент c.
Выбор элемента задается аналогично перечислению, только разделительным символом является не запятая, а знак '|'. Например, (a | b | c) задает выбор одного из трех элементов a, b или c.
При записи выбора и перечисления элементы могут также указываться с использованием модификаторов количества.
Пример(a* | b? | с | d+)
определяет содержимое, как последовательность, состоящую из нуля или более элементов a или одного элемента b, который может быть пропущен, или ровно одного элемента с, или последовательностью, состоящей из одного или более элементов d.
Помимо этого, формальные правила могут использовать при записи другие формальные правила.
Пример((a | b), (с | d))
задает содержимое, первым элементом которого является a или b, вторым — элемент с или d.
Содержимое элементов может также включать символьные данные, которые обозначаются при помощи ключевого слова #PCDATA (parsable character data — разбираемые символьные данные).
Пример<!ELEMENT product (#PCDATA)>
означает, что элемент product должен содержать только символьные данные.
Помимо текста элементы могут также включать в себя другие элементы. Содержимое такого типа называется смешанным. Формальные правила смешанного содержимого должны всегда иметь вид (#PCDATA | ... | ... ) *.
При помощи формальных правил можно точно и гибко задавать логическую структуру элементов документа. В качестве примера приведем определения элементов для нашего документа с рекламным объявлением.
ПримерПредположим, мы хотим определить документ со следующей логической структурой:
□ корневым элементом документа является элемент advert;
□ элемент advert содержит последовательность, состоящую из нескольких элементов product и одного элемента classified, который может быть пропущен;
□ элемент product может содержать текст и другие элементы product в любом порядке;
□ элемент classified не имеет содержимого.
Документ соответствующей логической структуры может быть задан следующим образом.
Листинг 1.4<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE advert [
<!ELEMENT advert (product+, classified*)>
<!ELEMENT product (#PCDATA | product)*>
<!ELEMENT classified EMPTY>
]>
<advert>
<product>
Покупайте наших слонов!
</product>
<classified/>
</advert>
Определению элемента соответствует EBNF-продукция elementdecl:
[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
Нетерминал contentspec, следующий через пробельное пространство за именем элемента, определяет тип содержимого, которое может иметь этот элемент:
[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children
Строка "EMPTY" соответствует пустому элементу, "ANY" — любому содержимому, нетерминал Mixed — смешанному содержимому, children — содержимому, которое определяется формальными правилами.
[47] children ::= (choice | seq) ('?' | '*' | '+')?
[48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
[49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')'
[50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'
[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')'
Определение списка атрибутов
Список атрибутов некоторого элемента задается следующим образом:
<!ATTLIST элемент
атрибут1 тип1 значение1
атрибут2 тип2 значение2
и т. д...>
В этом определении элемент задает имя элемента, для которого определяется данный список атрибутов, атрибут — имя атрибута, тип — тип атрибута и значение — значение атрибута.