Основы XML
9123a142

Использование и внешних, и внутренних подмножеств 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 для конкретного документа путем включения внутреннего подмножества. Ваше внутреннее подмножество может добавлять элементы, атрибуты или примитивы – он также может изменять определения атрибутов или примитивов.

Содержание раздела