Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
k5.doc
Скачиваний:
3
Добавлен:
13.11.2019
Размер:
287.23 Кб
Скачать

Использование и внешних, и внутренних подмножеств 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.)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]