Технология XSLT - страница 18

стр.

— имя атрибута, >тип — тип атрибута и >значение — значение атрибута.

>Имя атрибута отвечает в XML тем же самым требованиям, что и имя элемента — оно должно начинаться с буквы и может содержать другие буквы, цифры и некоторые знаки препинания.

>Тип атрибута может быть одним из следующих:

□ >CDATA — символьные данные;

□ >ID — уникальный идентификатор;

□ >IDREF — ссылка на уникальный идентификатор;

□ >IDREFS — набор ссылок;

□ >ENTITY — сущность;

□ >ENTITIES — набор сущностей;

□ >NMTOKEN — именной токен;

□ >NMTOKENS — набор именных токенов;

□ >NOTATION — нотация;

□ перечисление возможных значений атрибута.

Следует поподробнее остановиться на типе >ID, поскольку атрибуты этого типа играют важную роль в повышении эффективности обработки XML-документов. Атрибуты типа >ID могут содержать значения, которые однозначным образом идентифицируют элемент в документе. То есть, если тип атрибута объявлен как >ID, его значение должно быть уникальным внутри документа. Это позволяет создавать для элементов с >ID-атрибутами индексы по значению атрибута, для более быстрого доступа. Например, в языке XPath, имеется функция >id, которая по данному строковому параметру возвращает множество, состоящее из элемента, >ID-атрибут которого совпадает с этим параметром. Естественно, тип >ID не гарантирует, что доступ к элементам в любом случае будет производиться быстрее — это зависит от реализации обрабатывающих программ. Однако большинство современных XML-процессоров при работе с >ID-атрибутами используют механизмы оптимизации.

Тип >ID может быть полезен и при создании кросс-ссылок между элементами в самих XML-документах, для описания информации, структура которой выходит за рамки обычных деревьев. Уникальные значения, заданные в атрибуте >ID могут использоваться в атрибутах типов >IDREF (ссылка на идентифицирующее значение) и >IDREFS (набор таких ссылок).

>Значение определяет, как и какие значения должны быть присвоены атрибуту. >Значением может быть:

□ ключевое слово >#REQUIRED, которое показывает, что этот атрибут должен всегда присутствовать в элементе и иметь некоторое значение;

□ ключевое слово >#IMPLIED, которое показывает, что атрибут является необязательным и может отсутствовать в элементе;

□ ключевое слово >#FIXED, за которым следует значение, заключенное в кавычки — это задает атрибут, который всегда должен иметь одно и то же фиксированное значение;

□ значение, заключенное в кавычки, определяет значение атрибута по умолчанию.

Примеры

Декларация

>

> title CDATA #REQUIRED

> id ID #IMPLIED

> quantity CDATA "1"

> value CDATA #FIXED "дорого"

> color (серый|белый) "серый">

определяет в элементе >product следующие атрибуты:

□ обязательный атрибут >title, содержащий символьные данные;

□ необязательный атрибут >id, который может содержать уникальный идентификатор элемента внутри документа;

□ атрибут >quantity, который может и не присутствовать в документе — в этом случае его значение будет равно >1;

□ атрибут >value, который всегда должен иметь значение >"дорого";

□ атрибут >color, который может иметь одно из значений — >"серый" или >"белый", по умолчанию >"серый".

Разберем синтаксис определения списка атрибутов более детально. Этому определению соответствует следующее правило:

>[52] AttlistDecl ::= ''

В этом правиле >Name задает имя элемента, a >AttDef* — набор определяемых атрибутов. Каждый атрибут задается правилом >AttDef:

>[53] AttDef ::= S Name S AttType S DefaultDecl

Здесь >Name — имя, >AttType — тип, a >DefaultDecl — значение атрибута по умолчанию.

>[54] AttType ::= StringType | TokenizedType | EnumeratedType

В соответствии со спецификацией, значения атрибутов бывают трех видов — строки (>StringType), токены (>TokenizedType) и тип перечисления (>EnumeratedType).

>[55] StringType    ::= 'CDATA'

>[56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY'

>                       | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'

Тип перечисления (>EnumeratedType) может задаваться нотациями (>NotationType) и собственно перечислениями (>Enumeration):

>[57] EnumeratedType ::= NotationType | Enumeration

>[58] NotationType   ::= 'NOTATION' S