Опубликован: 24.01.2007 | Доступ: свободный | Студентов: 9068 / 1431 | Оценка: 4.28 / 4.09 | Длительность: 20:51:00
Лекция 5:

Создание валидных XML-документов

Тип атрибута

Тип атрибута является вторым необходимым компонентом в определении атрибута. Он задает вид значений, которые вы можете присваивать атрибуту внутри документа, как показано на рисунке 5.4.


Рис. 5.4.

Вы можете задавать тип атрибута тремя различными способами.

  • Строковый тип. Строковый тип атрибута может быть назначен любой строке в кавычках (литералу), которая отвечает общим правилам, описанным в разделе "Правила для корректного задания значений атрибутов" в "Создание корректно сформированных XML-документов" . Вы должны объявить строковый тип атрибута с использованием ключевого слова CDATA, как это сделано для определения атрибута Class в следующем примере:
    <!ATTLIST FILM  Class CDATA "fictional">
  • Маркерный тип. Значения, которые вы можете присваивать атрибуту маркерного типа, имеют ряд ограничений (см. следующий раздел).
  • Нумерованный тип. Для нумерованного типа атрибута вы можете присваивать одно значение или список определенных значений. Об этом типе вы узнаете в разделе "Задание нумерованных типов" далее в этой лекции.

Задание маркерного типа

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

Кроме того, значение должно отвечать определенному ограничению, которое вы задаете в описании атрибута с помощью соответствующего ключевого слова. Например, в приведенном ниже XML-документе для атрибута StockCode определен маркерный тип с использованием ключевого слова ID. ( ID – это только одно из ключевых слов, которые вы можете использовать для объявления маркерного типа.) Это ключевое слово означает, что для каждого элемента атрибуту должно быть присвоено уникальное значение. (Например, присвоение товарного кода "S021" двум элементам ITEM не допускается.)

<?xml version="1.0" encoding="windows-1251" ?>
<!DOCTYPE INVENTORY
	[
	<!ELEMENT INVENTORY (ITEM*)>
	<!ELEMENT ITEM (#PCDATA)>
	<!ATTLIST ITEM  StockCode ID #REQUIRED>
	]
>
<INVENTORY>
	<!-- Каждый элемент ITEM должен иметь свое значение кода StockCode -->
	<ITEM StockCode="S021">Peach Tea Pot</ITEM>
	<ITEM StockCode="S034">Electric Coffee Grinder</ITEM>
	<ITEM StockCode="S086">Candy Thermometer</ITEM>
</INVENTORY>

Ниже приведен полный список ключевых слов, которые вы можете использовать в определении маркерных типов атрибутов, и ограничения, которые они накладывают на значения атрибутов.

  • ID. Для каждого элемента атрибут должен иметь уникальное значение. Значение должно начинаться с буквы или символа подчеркивания (_), за которыми могут идти или не идти другие буквы, цифры, символы точки (.), тире (–) или символы подчеркивания. Данный тип элемента может иметь только один атрибут типа ID, а в объявлении значения атрибута по умолчанию должно фигурировать #REQUIRED или #IMPLIED (см. в разделе "Объявление значения по умолчанию" далее в этой лекции). Пример этого типа атрибута содержится в приведенном выше документе INVENTORY.
  • IDREF. Значение атрибута должно совпадать со значением атрибута элемента типа ID внутри документа. Другими словами, этот тип атрибута является ссылкой на уникальный идентификатор другого атрибута. Например, вы можете добавить атрибут IDREF с именем GoesWith к элементу ITEM:
    <!ELEMENT ITEM (#PCDATA)>
    <!ATTLIST ITEM
    	StockCode ID #REQUIRED  GoesWith IDREF #IMPLIED>

    Далее вы можете использовать этот атрибут для ссылки на другой элемент ITEM:

    <ITEM StockCode="S034">Electric Coffee Grinder</ITEM>
    <ITEM StockCode="S047" GoesWith="S034">
    	Coffee Grinder Brush
    	</ITEM>
  • IDREFS. Этот тип атрибута похож на тип IDREF, но при этом значение может включать ссылки на несколько идентификаторов – разделенных пробелами – внутри строки в кавычках. Например, если вы назначите атрибуту GoesWith тип IDREFS таким образом:
    <!ATTLIST ITEM  StockCode ID #REQUIRED  GoesWith IDREFS #IMPLIED>

    то можете использовать его на ссылки на несколько других элементов:

    <ITEM StockCode="S034">Electric Coffee Grinder</ITEM>
    <ITEM StockCode="S039">
    	1 pound Breakfast Blend Coffee Beans
    	</ITEM>
    <ITEM StockCode="S047" GoesWith="S034 S039">
    	Coffee Grinder Brush
    </ITEM>
  • ENTITY. Значение атрибута должно совпадать с именем примитива, объявленного в DTD. Этот примитив не обрабатывается синтаксическим анализатором и ссылается на внешний файл, обычно содержащий не XML-данные. О таких примитивах будет рассказано в "Определение и использование примитивов" .

    Например, в DTD вы объявляете элемент с именем IMAGE, представляющий графическое изображение, и атрибут типа ENTITY с именем Source, указывающий на источник графических данных:

    <!ELEMENT IMAGE EMPTY>
    <!ATTLIST IMAGE  Source ENTITY #REQUIRED>

    Если вы объявили не анализируемый примитив с именем Logo (используя технику, с которой вы познакомитесь в "Определение и использование примитивов" ), который содержит графические данные для изображения, вы можете присвоить этот примитив атрибуту Source элемента IMAGE в документе следующим образом:

    <IMAGE Source="Logo" />
  • ENTITIES. Этот тип атрибута похож на тип ENTITY, за исключением того, что значение может содержать имена нескольких не анализируемых примитивов – разделенных пробелами – внутри строки в кавычках. Например, если вы назначили атрибуту Source тип ENTITIES следующим образом:
    <!ELEMENT IMAGE EMPTY>
    <!ATTLIST IMAGE Source ENTITIES #REQUIRED>

    то сможете использовать его для ссылки на несколько не анализируемых примитивов (допустим, примитивов, содержащих графические данные в альтернативных форматах), например, так:

    <IMAGE Source="LogoGif LogoBmp" />

    (Здесь подразумевается, что LogoGif и LogoBmp – имена не анализируемых примитивов, которые были объявлены в DTD с помощью приемов, с которыми вы познакомитесь в "Определение и использование примитивов" .)

  • NMTOKEN. Это значение есть элементарное имя (name token), представляющее собой имя, состоящее из одной или более букв, цифр, точек (.), тире (–) или символов подчеркивания (_). Элементарное имя может также содержать двоеточие (:), но не на первом месте. Например, если вы назначите атрибуту ISBN тип NMTOKEN следующим образом:
    <!ELEMENT BOOK (#PCDATA)>
    <!ATTLIST BOOK  ISBN NMTOKEN #REQUIRED>

    то можете присвоить ему значение, начинающееся с цифры (цифры в качестве первых символов допустимы для типов NMTOKEN и NMTOKENS, но не для любых других маркерных типов):

    <BOOK ISBN="9-99999-999-9">The Portrait of a Lady</BOOK>
  • NMTOKENS. Этот тип атрибута похож на тип NMTOKEN, но значение может содержать несколько элементарных имен – разделенных пробелами – внутри строки в кавычках. Например, если вы назначите атрибуту Codes тип NMTOKENS следующим образом:
    <!ELEMENT SHIRT (#PCDATA)>
    <!ATTLIST SHIRT Codes NMTOKENS #REQUIRED>

    вы можете присвоить ему несколько значений в виде элементарных имен:

    <SHIRT Codes="38 21 97">long sleeve Henley</SHIRT>
Максим Попов
Максим Попов

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

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

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

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

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

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

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

Спасибо!

Геннадий Шестаков
Геннадий Шестаков
Беларусь, Орша
Наталья Алмаева
Наталья Алмаева
Россия