Описание элементов в DTD. Контейнерные и пустые элементы

В DTD каждый элемент, входящий в язык разметки, определяется с помощью инструкции ELEMENT.

<!ELEMENT имя_элемента (модель_содержания)>

Объявление элемента содержит

· ключевое слово ELEMENT,

· имя элемента (тега) и

· описание содержания, разрешенного для определяемых элемент, которое называется моделью содержания.

Содержание элемента (тело) включает все, что находится между открывающим и закрывающим тегами элемента.

В XML-документах применяются элементы двух типов:

а) контейнерные, т.е. элементы, содержащие текст и другие элементы,

б) пустые элементы, которые ничего не содержат.

Содержанием контейнерного элемента могут быть

· символьные данные,

· другие элементы, которые разрешено помещать в контейнер данного типа,

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

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

Базовые типы моделей содержания

1. Элементы с пустым содержанием(empty content).

Пустой элемент не может содержать ничего — ни текст, ни вложенные элементы.

Для описания содержания пустого элемента используется ключевое слово EMPTY, означающее "пустой": <!ELEMENT br EMPTY>

Хотя пустые элементы не имеют никакого содержания, они могут иметь атрибуты.

2. Описание элементов контейнерного типа.

Для контейнерных элементов существует несколько типов содержания.

а) Элементы с символьным содержанием(#PCDATA).

Символьные данные — это простейшая модель содержания элемента, между начальным и конечным тегами может быть помещен только текст без разметки, но при этом в нем могут встречаться себя ссылки на сущности, инструкции обработки и комментарии. Поэтому при анализе документа эти данные должны обрабатываться парсером, а объявляются они с помощью ключевого слова #PCDATA, которое подчеркивает эту особенность — parsed character data (анализируемые символьные данные). Например, html-элемент <title> должен быть объявлен как:

<!ELEMENT title (#PCDATA)>

б) "Элементное" содержание (element content).

Содержание таких элементов может быть составлено только из других элементов, текст запрещен.

В этой модели должно указываться, сколько именно элементов может быть задано, и в каком порядке они должны быть размещены в элементе. Например, элемент person, который содержит структурированную элементами firstname и lastname информацию об имени и фамилии человека, должен быть определен следующим образо

<!ELEMENT person (firstname, lastname)>

<!ELEMENT firstname (#PCDATA)>

<!ELEMENT lastname (#PCDATA)>

Применение описанного элемента:

<person>

<firstname>Иван</first>

<lastname>Иванов</lastname>

</person>

в) Элементы о смешанным содержанием (mixed content).

Смешанное содержание соответствует наличию в составе элемента смеси элементов и анализируемых символьных данных (PCDATA).

<!ELEMENT element (#PCDATA|element2)*>

Это объявление соответствует смешанному типу и содержание (после замены всех ссылок на сущности соответствующим текстом) состоит из символьных данных, комментариев, инструкций обработки и дочерних элементов, тип которых соответствует перечисленным в модели содержания.

г) Произвольное содержание.

Это случай, когда нужно разрешить элементу XML любое содержание, соответствующего требованиям правильно оформленного документа, то для описания такого содержания используется ключевое слово ANY:

<!ELEMENT body ANY>

Это объявление соответствует элементу с произвольным содержанием (после замены всех ссылок на сущности соответствующим текстом), который состоит из символьных данных и дочерних элементов, типы которых уже были объявлены.

д) Пустой элемент(empty content).

Пустой элемент не может содержать текст или порожденные элементы. Но он может иметь атрибуты. Для описания элемента используется ключевое слово EMPTY.

<!ELEMENT BODYTEXT EMPTY>

Это объявление элемента с пустым содержанием, который не может иметь содержания (даже пробельные символы).

Более сложные модели содержания

Базовые типы содержания элементов, можно использовать для описания более сложных моделей содержания.

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

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

<!ELEMENT chapter (title,summary?,paragraphs+)>

 

Символ Имя символа Описание
Операторы порядка
| вертикальная черта играет роль связки "или"
, запятая указывает, что элемент, расположенный перед запятой, должен появляться первым, а за ним следовать элемент, записанный после запятой (определяет обязательный порядок элементов)
( ) круглые скобки служат для группировки элементов с указанием порядка их появления; все элементы, расположенные в скобках, должны быть предварительно определены
Операторы множественности (кардинальности)
? знак вопроса указывает, что перечисленные элементы являются необязательными, но если элемент указан, то он может использоваться только один раз (0 – 1)
* звездочка указывает, что элемент может перечисляться любое количество раз или ни разу (ноль или больше, 0 – ¥)
+ плюс по крайней мере, должен присутствовать один элемент, и этот элемент может использоваться более чем один раз (один или больше, (1 – ¥)
  отсутствие символов указывает на то, что может использоваться один и только один из элементов (1)

 

(cardinal number переводится как "количественное существительное").

Совместно с группировкой моделей элементов или содержания множители позволяют формировать очень сложные структуры. Например,

<!ELEMENT FromBasket (Cherry+, (Apple|Orange)*)>