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