
- •Основной критерий для валидного документа
- •Требования корректности формирования и валидности
- •Преимущества использования валидных xml-документов
- •Добавление dtd
- •Форма записи dtd
- •Создание dtd
- •Объявление типов элементов
- •Форма записи объявления типа элемента
- •Описание содержимого элемента
- •Задание содержимого элемента
- •Символ Значение
- •Задание смешанного содержимого
- •Объявление атрибутов
- •Форма записи объявления списка атрибутов
- •Тип атрибута
- •Задание маркерного типа
- •Задание нумерованных типов
- •Объявление значения по умолчанию
- •Использование внешних подмножеств dtd
- •Использование только внешнего подмножества dtd
- •Использование и внешних, и внутренних подмножеств dtd
- •Условия игнорирование разделов внешнего подмножества dtd
- •Преобразование корректно сформированного документа в валидный
- •Сделаем документ валидным
Использование и внешних, и внутренних подмножеств dtd
Чтобы использовать и внешнее и внутреннее подмножество DTD, следует использовать ключевое слово SYSTEM вместе с системным литералом, задающим местонахождение файла с внешним подмножеством DTD, после чего внутри квадратных скобок ([]) следует объявление разметки внутреннего подмножества DTD.
Вот пример простого XML-документа, имеющего как внутреннее, так и внешнее подмножество DTD:
<?xml version="1.0"?>
<!DOCTYPE BOOK SYSTEM "Book.dtd"
[
<!ATTLIST BOOK ISBN CDATA #IMPLIED Year CDATA "2000">
<!ELEMENT TITLE (#PCDATA)>
]
>
<BOOK Year="1998">
<TITLE>The Scarlet Letter</TITLE>
</BOOK>
Вот содержимое файла Book.dtd, в котором хранится внешнее подмножество DTD:
<!ELEMENT BOOK ANY>
<!ATTLIST BOOK ISBN NMTOKEN #REQUIRED>
Если вы используете внешнее и внутреннее подмножество DTD, XML-процессор объединяет их содержимое следующим образом:
в общем случае он осуществляет слияние двух подмножеств, чтобы сформировать полный DTD. В рассмотренном примере объединенный DTD определяет два элемента, TITLE и BOOK, а также два атрибута для элемента BOOK, ISBN и Year;
однако в случае, если атрибут с одним и тем же именем и типом элемента объявляется более одного раза, XML-процессор использует первое объявление и игнорирует все последующие; (Это правило применимо и для повторных объявлений примитивов, о чем будет рассказано в лекции 6.)
внутреннее подмножество DTD имеет приоритет перед внешним подмножеством DTD (даже если ссылка на внешнее подмножество идет первой в объявлении типа документа). Таким образом, любой атрибут (или примитив), определенный во внутреннем подмножестве, доминирует над атрибутом с тем же именем и типом элемента, объявленным во внешнем подмножестве. В примере XML-процессор считает, что атрибут ISBN имеет тип CDATA и объявление значения по умолчанию #IMPLIED, поэтому следующий элемент (в котором не указан ISBN) является корректным:
<BOOK Year="1850">
<TITLE>The Scarlet Letter</TITLE>
</BOOK>
Примечание. Хотя XML-процессор просто игнорирует повторные объявления атрибутов и примитивов, повторное объявление элемента (даже если он объявлен тем же самым образом) является допустимым.
Способ объединения внутреннего и внешнего подмножеств DTD XML-процессором дает вам возможность использовать общий DTD (например такой, который используется для XML-приложений) в качестве внешнего подмножества DTD, а затем адаптировать (или субклассировать, как говорят программисты) DTD для конкретного документа путем включения внутреннего подмножества. Ваше внутреннее подмножество может добавлять элементы, атрибуты или примитивы – он также может изменять определения атрибутов или примитивов.
Условия игнорирование разделов внешнего подмножества dtd
Вы можете заставить XML-процессор игнорировать часть внешнего подмножества DTD с помощью раздела IGNORE. Вы можете, например, использовать раздел IGNORE при разработке документа с целью временного отключения альтернативного или необязательного блока объявлений разметки. При этом вам не нужно удалять строки, а затем повторно их вставлять. (Если вы программист, то вам известно, что такой прием подобен "комментированию" фрагмента кода, который вы хотите временно игнорировать.) Раздел IGNORE начинается с символов <![IGNORE[ и заканчивается символами ]]>.
На рисунке 5.6 представлен пример полного описания внешнего подмножества DTD, включающего раздел IGNORE.
Рис. 5.6.
Если вы хотите временно восстановить блок объявлений разметки в разделе IGNORE, вам достаточно просто заменить ключевое слово IGNORE на INCLUDE, не удаляя при этом символы-ограничители (<![, [ и ]]>), как в следующем примере:
<![INCLUDE[
<!-- необязательный блок объявлений разметки,
который временно восстановлен -->
<!ATTLIST BOOK Category CDATA "fiction">
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT AUTHOR (#PCDATA)
]]>
Впоследствии вы можете снова быстро отключить раздел, вернув заголовок IGNORE. Раздел INCLUDE, вложенный в раздел IGNORE, также игнорируется.
Примечание. Вы можете использовать разделы IGNORE и INCLUDE только во внешнем подмножестве DTD, либо во внешнем параметрическом примитиве. (Внешний параметрический примитив ссылается на отдельный файл, который – подобно внешнему подмножеству DTD – содержит объявления разметки, подробнее об этом вы узнаете в лекции 6.)