Спецификация содержимого
В объявлении элемента вы указываете, что может появиться в качестве содержимого этого элемента Если вам нужно объявить элемент, который не должен содержать никаких данных, вы можете использовать тип EMPTY (например, <!ELMENT img EMPTY>).
Хороший пример пустого элемента — элемент HTML img Чтобы этот элемент не нарушал принципа допустимости документа XML, нужно использовать синтаксис, определенный для пустого элемента XML:
<img src="mycar.jpg" />
Если вам нужно, чтобы в элементе были только данные PCDATA, используется следующее объявление:
<!ELEMENT mymemoirs #PCDATA>
Вы можете также указать, какие типы элементов могут появиться в элементе, в каком порядке и в каком количестве, как показано в следующем примере [My memoires — мои воспоминания, title — название, author — автор, philosophizing — философствования, sad_story — грустная история, funny_story — смешная история, lesson — наставление, conclusion — вывод — Примеч nepee ]:
<!ELEMENT mymemoires (
title, author, philosophizing, sad_story,
funny_story, lesson, conclusion)>
В данном примере каждый из приведенных типов элементов должен появиться один раз (и только раз) внутри элемента mymemories в том порядке, в котором они перечислены в объявлении.
ПРИМЕЧАНИЕ
Элементы, которые появляются в элементе mymemoires, называются его дочерними элементами, а сам элемент mymemoires называется родительским. Каждый элемент может быть дочерним по отношению к любому количеству других элементов в документе. Элементы, разделенные более чем одним уровнем в иерархической системе, называются внуками, правнуками и т. д. (или соответственно дедами, прадедами — в другом направлении). Также можно при описании взаимоотношений между элементами использовать термины «предок» и «потомок».
Вы можете создать более гибкие правила, используя операторы повторяемости. Ниже показаны три оператора:
? — элемент должен встретиться один раз или не встретиться ни разу;
+ — элемент должен встретиться один или более раз;
* — элемент может встретиться любое количество раз или не встретиться вовсе.
Ниже снова приведено объявление элемента mymemoirs, переписанное с использованием операторов повторяемости:
<!ELEMENT mymemoires (title, author, philosophizing+,
sad_story*, funny_story*,
lesson*, conclusion)>
Вы также можете указать, что некоторые элементы могут появиться как альтернатива другим элементам (то есть что между ними нужно делать выбор) с помощью вертикальной черты (|):
<!ELEMENT mymemoires (title, author, philosophizing+,
sad_story*, funny_story*,
lesson+| conclusion)>
В этом объявлении элемент mymemoirs может содержать один или более элементов lesson или conclusion, но не оба одновременно. Еще более сложные правила можно создавать с использованием вложенных скобок. В листинге 1.4 показано, как может выглядеть определение mymeroirs.dtd [Paragraph - абзац, letter — письмо. — Примеч. перев. ].
Листинг 1.4. Полная версия определения mymeroirs.dtd
<!ELEMENT mymemoirs (title, author, philosophizing*,
sad_story*, funny_story*,
(lesson+ | conclusion)*)>
<!ELEHENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT philosophizing (paragraph)*>
<!ELEMENT sad_story (paragraph*, letter*, (lesson | conclusion)*)>
<!ELEMENT funny_story (paragraph*, letter*.
(lesson | conclusion)*)>
<!ELEMENT letter (paragraph)*>
<!ELEMENT lesson (paragraph)*>
<!ELEMENT conclusion (paragraph)*>
<!ELEMENT paragraph (#PCDATA)>
Наименее строгим является правило, которое можно выразить словами: «подходит что угодно». Если вы хотите указать, что в данном элементе могут появиться любые проверенные символьные данные или элементы, вы должны использовать ключевое слово ANY (любой), как показано в следующем примере:
<!ELEMENT mymemoirs ANY>
ПРИМЕЧАНИЕ
Такое широкое правило, как элемент типа ANY, не вполне вписывается в строгую структуру XML. Вообще говоря, если вы создаете определение DTD, в котором используется ключевое слово ANY, вы, вероятно, делаете ошибку и вам следует поискать лучший способ определения.