Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_XML.doc
Скачиваний:
16
Добавлен:
03.05.2019
Размер:
3.94 Mб
Скачать

3.14. Использование внешних и внутренних подмножеств 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>Письмо Скарлет</TITLE>

</BOOK>

Вот содержимое файла Book.dtd, в котором хранится внешнее подмножеcтво DTD:

<!ELEMENT BOOK ANY>

<!ATTLIST BOOK ISBN NMTOKEN #REQUIRED>

При использовании внешнего и внутреннего подмножества DTD, XML-процессор объединяет их содержимое следующим образом:

  • в общем случае он осуществляет слияние двух подмножеств, чтобы сформировать полный DTD. В рассмотренном примере объединенный DTD определяет два элемента, TITLE и BOOK, а также два атрибута для элемента BOOK: ISBN и Year,

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

  • внутреннее подмножество DTD имеет приоритет перед внешним подмножеством DTD (даже если ссылка на внешнее подмножество идет первой в объявлении типа документа). Таким образом, любой атрибут (или примитив), определенный во внутреннем подмножестве, доминирует над атрибутом с тем же именем и типом элемента, объявленным во внешнем подмножестве. В примере XML-процессор считает, что атрибут ISBN имеет тип CDATA и объявление значения по умолчанию #IMPLIED, поэтому следующий элемент (в котором не указан ISBN) является корректным:

<BOOKYear="1850">

<TITLE>The Scarlet Letter</TITLE>

</ВООК>

Хотя XML-процессор просто игнорирует повторные объявления атрибутов и примитивов, повторное объявление элемента (даже если он объявлен тем же самым образом) является допустимым.

Способ объединения внутреннего и внешнего подмножеств DTD XML-процессором дает вам возможность использовать общий DTD (например такой, который используется для XML-приложений) в качестве внешнего подмножества DTD, а затем адаптировать (или субклассироватъ, как говорят программисты) DTD для конкретного документа путем включения внутреннего подмножества. Внутреннее подмножество может добавлять элементы, атрибуты или примитивы — он также может изменять определения атрибутов или примитивов.

3.15. Условия игнорирования разделов внешнего подмножества dtd

Можно заставить XML-процессор игнорировать часть внешнего под-множества DTD с помощью раздела IGNORE. Можно, например, использовать раздел IGNORE при разработке документа с целью временного отключения альтернативного или необязательного блока объявлений разметки. При этом не нужно удалять строки, а затем повторно их вставлять. (такой прием подобен “комментированию” фрагмента кода, который необходимо временно игнорировать.) Раздел IGNORE начинается с символов <![IGNORE[ и зааканчивается символами ]]>.

На следующем рисунке представлен пример полного описания внешнего подмножества DTD, включающего раздел IGNORE.

Если необходимо временно восстановить блок объявлений разметки в разделе IGNORE, достаточно просто заменить ключевое слово IGNORE на INCLUDE, не удаляя при этом символы-ограничители (<![, [ и ]]>), как в следующем примере:

<![INCLUDE[

<!-- необязательный блок объявлений разметки,

который временно восстановлен -->

<!ATTLIST BOOK Category CDATA "вымысел">

<ELEMENT TITLE (#PCDATA)>

<!ELEMENT AUTHOR (#PCDATA)

]]>

Впоследствии можно снова быстро отключить раздел, вернув заголовок IGNORE. Раздел INCLUDE, вложенный в раздел IGNORE, также игнорируется.

Разделы IGNORE и INCLUDE можно использовать только во внешнем подмножестве DTD либо во внешнем параметрическом примитиве. (Внешний параметрический примитив ссылается на отдельный файл, который — подобно внешнему подмножеству DTD - содержит объявления разметки, подробнее об этом вы узнаете далее.)