Объявление параметрического внешнего разбираемого примитива
Объявление для параметрического внешнего разбираемого примитива имеет следующую форму записи:
<!ENTITY % ИмяПримитива SYSTEM СистемЛитерал>
Здесь ИмяПримитива есть имя примитива. Вы можете выбрать любое имя, следуя правилам задания имен для параметрических примитивов, приведенных в предыдущем разделе.
СистемЛитерал есть системный литерал, который описывает местонахождение файла, содержащего данные примитива. Системный литерал может быть заключен в одинарные (') или двойные (") кавычки и содержать любые символы, за исключением символа кавычек, который используется в качестве ограничителя.
Системный литерал задает URI файла, содержащего данные параметрического примитива. В настоящее время URI практически аналогичен стандартному унифицированному указателю ресурса Internet (URL). Вы можете использовать как полностью заданный URI, например:
<!ENTITY % declarations SYSTEM "HYPERLINK "http://bogus.com/documents/Declarations.dtd" http://bogus.com/documents/Declarations.dtd">
Либо вы можете использовать частичный URI, задающий местонахождение относительно местонахождения XML-документа, содержащего URI, например:
<!ENTITY % declarations SYSTEM "Declarations.dtd">
Относительные URI в XML-документах работают подобно относительным URL для HTML-страниц. Для более подробной информации об URI обратитесь к разделу "Использование только внешнего подмножества DTD" в лекции 5.
Файл параметрического внешнего примитива должен содержать полные объявления разметки всех типов, допустимых в DTD. В частности, он может содержать объявления типа элемента, объявления списка атрибутов, объявления примитивов, объявления нотаций, инструкции по обработке, или комментарии. (Эти типы объявлений разметки описаны в разделе "Создание DTD" в лекции 5.) Вы также можете включать ссылки на параметрические примитивы и разделы INCLUDE и IGNORE. (См. раздел "Условное игнорирование разделов внешнего подмножества DTD" в лекции 5.)
Вы можете использовать параметрические внешние разбираемые примитивы для хранения группы взаимосвязанных объявлений. Допустим, вы занимаетесь продажей книг, CD-ROM, плакатов и другой продукции. Вы можете поместить объявления для каждого вида продукции в отдельный файл. Это позволит вам объединять эти группы объявлений различными способами. Например, вы хотели бы создать XML-документ, который описывает только имеющиеся у вас в наличии книги и CD-ROM. Для этого вы можете поместить объявления для книг и CD-ROM в DTD документа с помощью параметрических внешних разбираемых примитивов, как показано в следующем примере XML-документа:
<?xml version="1.0"?> <!DOCTYPE INVENTORY [ <!ELEMENT INVENTORY (BOOK | CD)*> <!ENTITY % book_decls SYSTEM "Book.dtd"> <!ENTITY % cd_decls SYSTEM "CD.dtd"> %book_decls; %cd_decls; ] > <INVENTORY> <BOOK> <BOOKTITLE>The Marble Faun</BOOKTITLE> <AUTHOR>Nathaniel Hawthorne</AUTHOR> <PAGES>473</PAGES> </BOOK> <CD> <CDTITLE>Concerti Grossi Opus 3</CDTITLE> <COMPOSER>Handel</COMPOSER> <LENGTH>72 minutes</LENGTH> </CD> <BOOK> <BOOKTITLE>Leaves of Grass</BOOKTITLE> <AUTHOR>Walt Whitman</AUTHOR> <PAGES>462</PAGES> </BOOK> <!-- дополнительные виды продукции… --> </INVENTORY>
Вот содержимое файла примитива Book.dtd:
<!ELEMENT BOOK (BOOKTITLE, AUTHOR, PAGES)> <!ELEMENT BOOKTITLE (#PCDATA)> <!ELEMENT AUTHOR (#PCDATA)> <!ELEMENT PAGES (#PCDATA)>
А вот содержимое файла примитива CD.dtd:
<!ELEMENT CD (CDTITLE, COMPOSER, LENGTH)> <!ELEMENT CDTITLE (#PCDATA)> <!ELEMENT COMPOSER (#PCDATA)> <!ELEMENT LENGTH (#PCDATA)>
Заметим, что параметрический внешний разбираемый примитив работает во многом аналогично внешнему подмножеству DTD. Параметрические внешние примитивы, однако, обеспечивают большую гибкость – они разрешают вам включать несколько файлов внешних объявлений, причем в любом порядке. (Напомним, что внешнее подмножество DTD всегда обрабатывается после того, как полностью будет обработано подмножество внутреннего DTD.)