Опубликован: 24.01.2007 | Уровень: для всех | Доступ: свободно
Лекция 6:

Определение и использование примитивов

Объявление параметрического внутреннего разбираемого примитива

Объявление для параметрического внутреннего разбираемого примитива имеет следующую общую форму записи:

<!ENTITY % ИмяПримитива ЗначениеПримитива>

Здесь ИмяПримитива есть имя примитива. Вы можете выбрать любое имя, соблюдая следующие правила:

  • имя должно начинаться с буквы или символа подчеркивания (_), вслед за которым могут идти или не идти буквы, цифры, точки (.), тире (–) или символы подчеркивания;
  • примитив может иметь такое же имя, что и общий примитив в документе. (Параметрические и общие примитивы занимают различные пространства имен.) Имя примитива также может совпадать с именем элемента или атрибута;
  • помните, что для всего текста разметки, в том числе и для имен примитивов, имеет значение регистр, в котором набраны символы. Так, примитив под именем Spot будет отличаться от примитива под именем spot.

ЗначениеПримитива есть значение примитива. Значение, присваиваемое параметрическому примитиву, представляет собой группу символов, заключенных в кавычки (литерал). Вы можете присвоить параметрическому примитиву любое значение типа литерал, при условии соблюдения следующих правил:

  • строка должна быть ограничена одинарными (') или двойными (") кавычками;
  • строка не может содержать символов кавычек, которые используются в качестве ограничителей;
  • строка не может содержать символа процентов (%) и символа амперсанда (&), если это не начальный символ в ссылке на символ или общий примитив;
  • вы можете поместить параметрический примитив в DTD только как объявление разметки, но не внутри объявления разметки. Следовательно, строка ЗначениеПримитива должна содержать один или несколько типов объявлений разметки, которые разрешено использовать в DTD. Эти типы объявлений разметки описаны в разделе "Создание DTD" в "Создание валидных XML-документов" . В частности, параметрический примитив может содержать объявления типа элемента, объявления списка атрибутов, объявления общих примитивов, объявления нотаций, инструкции по обработке, или комментарии. (Объявления параметрических примитивов и ссылки не допускаются.)

Примечание. Приведенные здесь правила использования значений примитивов, которые вы можете без опасения применять в любых ситуациях, являются несколько упрощенными в отличие от правил, содержащихся в спецификации XML. Спецификация, в определенных обстоятельствах, разрешает вам включать в значение примитива дополнительные составляющие, а также помещать ссылку на примитив внутри разметки и между объявлениями разметки. Подробности приведены в разделе 4 спецификации XML, которую вы можете найти по адресу http://www.w3.org/TR/REC-xml.

Например, следующее DTD объявляет параметрический внутренний разбираемый примитив с именем author, который содержит три объявления разметки: комментарий, объявление типа элемента и объявление списка атрибутов. Содержимое примитива (т.е. замещающий его текст) помещается в конец DTD посредством ссылки на параметрический примитив ( %author; );

<!DOCTYPE BOOK
	[
	<!ENTITY % author
		"<!-- информация об авторе -->
		<!ELEMENT AUTHOR (#PCDATA)>
		<!ATTLIST AUTHOR  Nationality CDATA 'American'>"
	>
	<!ELEMENT BOOK (TITLE, AUTHOR)>
	<!ELEMENT TITLE (#PCDATA)>
	%author;
	]
>

Обратите внимание, что значение атрибута по умолчанию, которое содержится в объявлении примитива ('American'), ограничено одинарными кавычками, чтобы избежать использования такого же символа, который применяется для ограничения всего значения примитива. Приведенное выше DTD эквивалентено следующему:

<!DOCTYPE BOOK
	[
	<!ELEMENT BOOK (TITLE, AUTHOR)>
	<!ELEMENT TITLE (#PCDATA)>
	<! -- информация об авторе -->
	<!ELEMENT AUTHOR (#PCDATA)>
	<!ATTLIST AUTHOR  Nationality CDATA 'American'>
	]
>

Объявление параметрического внешнего разбираемого примитива

Объявление для параметрического внешнего разбираемого примитива имеет следующую форму записи:

<!ENTITY % ИмяПримитива SYSTEM СистемЛитерал>

Здесь ИмяПримитива есть имя примитива. Вы можете выбрать любое имя, следуя правилам задания имен для параметрических примитивов, приведенных в предыдущем разделе.

СистемЛитерал есть системный литерал, который описывает местонахождение файла, содержащего данные примитива. Системный литерал может быть заключен в одинарные (') или двойные (") кавычки и содержать любые символы, за исключением символа кавычек, который используется в качестве ограничителя.

Системный литерал задает URI файла, содержащего данные параметрического примитива. В настоящее время URI практически аналогичен стандартному унифицированному указателю ресурса Internet (URL). Вы можете использовать как полностью заданный URI, например:

<!ENTITY % declarations
	SYSTEM "http://bogus.com/documents/Declarations.dtd">

Либо вы можете использовать частичный URI, задающий местонахождение относительно местонахождения XML-документа, содержащего URI, например:

<!ENTITY % declarations SYSTEM "Declarations.dtd">

Относительные URI в XML-документах работают подобно относительным URL для HTML-страниц. Для более подробной информации об URI обратитесь к разделу "Использование только внешнего подмножества DTD" в "Создание валидных XML-документов" .

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

Вы можете использовать параметрические внешние разбираемые примитивы для хранения группы взаимосвязанных объявлений. Допустим, вы занимаетесь продажей книг, CD-ROM, плакатов и другой продукции. Вы можете поместить объявления для каждого вида продукции в отдельный файл. Это позволит вам объединять эти группы объявлений различными способами. Например, вы хотели бы создать XML-документ, который описывает только имеющиеся у вас в наличии книги и CD-ROM. Для этого вы можете поместить объявления для книг и CD-ROM в DTD документа с помощью параметрических внешних разбираемых примитивов, как показано в следующем примере XML-документа:

<?xml version="1.0" encoding="windows-1251" ?>
<!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.)

Максим Попов
Максим Попов

Почему при использовании скриптов, приведенных в курсе Основы XML

лекция Лекция 8: 

Отображение XML-документов с использованием связывания данных

не происходит связывания XLM документа с HTML?

Отображаются пустые поля. Браузер IE11

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!