Основы XML

       

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


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

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

<?xml version="1.0"?> <!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 Cofee 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 Cofee Grinder</ITEM> <ITEM StockCode="S047" GoesWith="S034"> Cofee Grinder Brush </ITEM>
  • IDREFS. Этот тип атрибута похож на тип IDREF, но при этом значение может включать ссылки на несколько идентификаторов – разделенных пробелами – внутри строки в кавычках. Например, если вы назначите атрибуту GoesWith тип IDREFS таким образом: <!ATTLIST ITEM StockCode ID #REQUIRED GoesWith IDREFS #IMPLIED>
    то можете использовать его на ссылки на несколько других элементов:
    <ITEM StockCode="S034">Electric Cofee Grinder</ITEM> <ITEM StockCode="S039"> 1 pound Breakfast Blend Cofee Beans </ITEM> <ITEM StockCode="S047" GoesWith="S034 S039"> Cofee Grinder Brush </ITEM>
  • ENTITY. Значение атрибута должно совпадать с именем примитива, объявленного в DTD. Этот примитив не обрабатывается синтаксическим анализатором и ссылается на внешний файл, обычно содержащий не XML-данные. О таких примитивах будет рассказано в лекции 6.
    Например, в DTD вы объявляете элемент с именем IMAGE, представляющий графическое изображение, и атрибут типа ENTITY с именем Source, указывающий на источник графических данных:
    <!ELEMENT IMAGE EMPTY> <ATTLIST IMAGE Source ENTITY #REQUIRED>
    Если вы объявили не анализируемый примитив с именем Logo (используя технику, с которой вы познакомитесь в лекции 6), который содержит графические данные для изображения, вы можете присвоить этот примитив атрибуту Source элемента IMAGE в документе следующим образом:
    <IMAGE Source="Logo" />
  • ENTITIES. Этот тип атрибута похож на тип ENTITY, за исключением того, что значение может содержать имена нескольких не анализируемых примитивов – разделенных пробелами – внутри строки в кавычках. Например, если вы назначили атрибуту Source тип ENTITIES следующим образом:


    <!ELEMENT IMAGE EMPTY> <!ATTLIST IMAGE Source ENTITIES #REQUIRED>
    то сможете использовать его для ссылки на несколько не анализируемых примитивов (допустим, примитивов, содержащих графические данные в альтернативных форматах), например, так:
    <IMAGE Source="LogoGif LogoBmp" />
    (Здесь подразумевается, что LogoGif и LogoBmp – имена не анализируемых примитивов, которые были объявлены в DTD с помощью приемов, с которыми вы познакомитесь в лекции 6.)
  • 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>
    Содержание раздела