Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






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



 

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

· определяет имена атрибутов, ассоциированных с элементом. В валидном документе можно включить в начальный тег элемента только те атрибуты, которые определены для элемента;

· устанавливает тип данных каждого атрибута;

· задает востребованность для каждого атрибута. Если атрибут не востребован, в объявлении списка атрибутов указывается, что должен делать процессор, если атрибут опущен. (В объявлении должно, например, содержаться значение атрибута по умолчанию, которое будет использовать процессор.)

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

 

<!ATTLIST Имя ОпрАтр>

 

Здесь “Имя” представляет собой имя элемента, ассоциированного с атрибутом или атрибутами. “OпрAтp” - это одно или несколько определений атрибутов, каждое из которых определяет один атрибут. Определение атрибута имеет следующую форму записи:

 

Имя ОпрАтр ОбъявУмолч

 

Здесь “Имя” представляет собой имя атрибута. (Правила выбора имен атрибутов приведены ранее). “OпрAтр” представляет собой тип атрибута, т.е. виды значений, которые могут быть присвоены атрибуту. (О типах атрибутов пойдет речь далее.) “ОбъявУмолч” - это объявление по умолчанию, которое указывает на востребованность атрибута и содержит другую информацию. (Об этом будет рассказано далее.) Допустим, вы объявили тип элемента с именем FILM следующим образом:

 

<!ELEMENT FILM (TITLE, (STAR | NARRATOR | INSTRUCTOR))>

 

Вот пример объявления списка атрибутов, которое описывает два атрибута - Class и Year - для элемента FILM:

 

<!ATTLIST FILM Class CDATA "fictional" Year CDATA #REQUIRED>

 

На следующем рисунке представлены составные части этого объявления.

Можно присвоить атрибуту Class любую строку в кавычках (ключевое слово CDATA); если опустить атрибут для определенного элемента, ему будет автоматически присвоено значение по умолчанию “fictional”. Можно присвоить атрибуту Year любую строку в кавычках; этот атрибут, однако, должен быть обязательно присвоен для каждого элемента FILM (ключевое слово #REQUIRED), поэтому он не имеет значения по умолчанию.



Следующий полный XML-документ включает это объявление списка атрибутов, а также элемент FILM:

 

<?xml version="1.0"?>

<!DOCTYPE FILM

[

<!ELEMENT FILM (TITLE, (STAR | NARRATOR | INSTRUCTOR))>

<!ATTLIST FILM Class CDATA "fictional" Year CDATA #REQUIRED>

<!ELEMENT TITLE (#PCDATA)>

<!ELEMENT STAR (#PCDATA)>

<!ELEMENT NARRATOR (#PCDATA)>

<ELEMENT INSTRUCTOR (#PCDATA)>

]

>

<FILM Year="1948">

<TITLE>После утра</TITLE>

<STAR>Морган Атенбери</STAR>

</FILM>

 

Для элемента FILM атрибуту Year присвоено значение “1948”. Атрибут Class опущен; однако, поскольку этот атрибут имеет значение по умолчанию (“fictional”), оно присваивается атрибуту, как если бы он был записан в качестве значения атрибута.

Если вы использовали для данного типа элемента более одного объявления списка атрибутов, содержания двух объявлений объединяются. Если атрибут с заданным именем объявлен для одного и того же элемента несколько раз, первое объявление используется, а последующие - игнорируются. (Множественные объявления списков атрибутов могут иметь место, если документ имеет как внутренние, так и внешние DTD, о чем пойдет речь далее.)

 

Тип атрибута

 

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

 

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

· Строковый тип. Строковый тип атрибута может быть назначен любой строке в кавычках (литералу), которая отвечает общим правилам, описанным выше. Строковый тип атрибута необходимо объявить с использованием ключевого слова CDATA, как это сделано для определения атрибута Class в следующем примере:



 

<!ATTLIST FILM Class CDATA "вымысел">

 

· Маркерный тип. Значения, которые можно присваивать атрибуту маркерного типа, имеют ряд ограничений (см. далее).

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

 

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

 

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

Кроме того, значение должно отвечать определенному ограничению, которое задаётся в описании атрибута с помощью соответствующего ключевого слова. Например, в приведенном ниже 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">Персиковый чай</ITEM>

<ITEM StockCode="S034">Электрокофемолка</ITEM>

<ITEM StockCode="S086">Термометр</ITEM>

</INVENTORY>

 

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

· ID. Для каждого элемента атрибут должен иметь уникальное значение. Значение должно начинаться с буквы или символа подчеркивания (_), за которыми могут идти или не идти другие буквы, цифры, символы точки (.), тире (-) или символы подчеркивания. Данный тип элемента может иметь только один атрибут типа ID, а в объявлении значения атрибута по умолчанию должно фигурировать #REQUIRED или #IMPLIED. Пример этого типа атрибута содержится в приведенном выше документе INVENTORY.

· IDREF. Значение атрибута должно совпадать со значением атрибута элемента типа ID внутри документа. Другими словами, этот тип атрибута является ссылкой на уникальный идентификатор другого атрибута. Например, можно добавить атрибут IDREF с именем GoesWith к элементу ITEM:

 

<!ELEMENT ITEM (#PCDATA)>

<!ATTLIST ITEM

StockCode ID #REQUIRED GoesWith IDREF #IMPLIED>

 

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

 

<IТЕМ StockCode="S034">Электрофемолка</ITEM>

<ITEM StockCode="S047" GoesWith="S034">Щётка</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):

 

<ВООК ISBN="9-99999-999-9">Рисунок человека</BOOK>

 

· NMTOKENS. Этот тип атрибута похож на тип NMTOKEN, но значение может содержать несколько элементарных имен — разделенных пробелами - внутри строки в кавычках. Например, если назначить атрибуту Codes тип NMTOKENS следующим образом:

 

<!ELEMENT SHIRT (#PCDATA)>

<!ATTLIST SHIRT Codes NMTOKENS #REQUIRED>

 

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

 

<SHIRTCodes="38 21 97'>long sleeve Henley</SHIRT>

 

Задание атрибута нумерованного типа

 

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

· Открывающая скобка, вслед за которой идет список элементарных имен, разделенных символами, после чего следует закрывающая скобка. Напомним, что элементарное имя — это имя, состоящее из одной или нескольких букв, цифр, точек (.), тире (-) или символов подчеркивания (_), а также может включать одно двоеточие (:), но не на первом месте. Например, для ограничения значения атрибута Class словами “вымысел”, “учебный” или “документальный”, данному атрибуту можно присвоить нумерованный тип следующим образом:

 

<!ATTLIST FILM Class (вымысел | учебный | документальный)

"вымысел"

Вот законченный XML-документ, демонстрирующий использование атрибута Class:

 

<?xml version="1.0"?>

<!DOCTYPE FILM

[

<!ELEMENT FILM (TITLE, (STAR | NARRATOR | INSTRUCTOR))>

<!ATTLIST FILM Class (вымысел | учебный | документальный) " вымысел ">

<!ELEMENT TITLE (#PCDATA)

<!ELEMENT STAR(#PCDATA)

<!ELEMENT NARRATOR(#PCDATA)

<!ELEMENT INSTRUCTOR (#PCDATA)

]

>

<FILM Class="учебный">

<TITLE>Использование XML</TITLE>

<NARRATOR>Пётр Иванов</NARRATOR>

</FILM>

Если опустить атрибут Class, ему будет по умолчанию присвоено значение “вымысел”. Присвоение атрибуту Class значения, отличного от “вымысел”, “учебный” или “документальный”, приведет к ошибке.

· Ключевое слово NOTATION, за которым идет пробел, затем открывающая скобка, затем список имен нотаций, разделяемых символами, после чего следует закрывающая скобка. Каждое из этих имен должно точно соответствовать имени нотации, объявленному в DTD. Нотация описывает формат данных или идентифицирует программу, применяемую для обработки определенного формата (подробнее о нотациях будет рассказано далее).

Например, в DTD объявлены нотации HTML, SGML и RTF. Тогда можно ограничить значения атрибута Format одним из этих имен нотаций с помощью следующего объявления:

 

<!ELEMENT EXAMPLE_DOCUMENT (#PCDATA)>

<!ATTLIST EXAMPLE_DOCUMENT

Format NOTATION (HTML | SGML | RTF) #REQUIRED>

 

В дальнейшем можно использовать атрибут Format для указания формата определенного элемента EXAMPLE_DOCUMENT, как в следующем примере:

 

<EXAMPLE_DOCUMENT Format="HTML">

<![CDATA[

<HTML>

<HEAD>

<TITLE>Моя домашняя страничка</TITLE>

</HEAD>

<BODY>

<P>Добро пожаловать!</P>

</BODY>

</HTML>

]]>

</EXAMPLE_DOCUMENT>

Присвоение атрибуту Format значения, отличного от “HTML”, “SGML” или “RTF”, приведет к ошибке. (Обратите внимание на использование здесь раздела CDATA — здесь можно свободно использовать символ левой угловой скобки (<) внутри символьных данных элемента.)

 


Эта страница нарушает авторские права

allrefrs.ru - 2018 год. Все права принадлежат их авторам!