Алексей Валиков - Технология XSLT
Имя атрибута отвечает в 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, за которым следует значение, заключенное в кавычки — это задает атрибут, который всегда должен иметь одно и то же фиксированное значение;
□ значение, заключенное в кавычки, определяет значение атрибута по умолчанию.
ПримерыДекларация
<!ATTLIST product
title CDATA #REQUIRED
id ID #IMPLIED
quantity CDATA "1"
value CDATA #FIXED "дорого"
color (серый|белый) "серый">
определяет в элементе product следующие атрибуты:
□ обязательный атрибут title, содержащий символьные данные;
□ необязательный атрибут id, который может содержать уникальный идентификатор элемента внутри документа;
□ атрибут quantity, который может и не присутствовать в документе — в этом случае его значение будет равно 1;
□ атрибут value, который всегда должен иметь значение "дорого";
□ атрибут color, который может иметь одно из значений — "серый" или "белый", по умолчанию "серый".
Разберем синтаксис определения списка атрибутов более детально. Этому определению соответствует следующее правило:
[52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
В этом правиле 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
'(' S? Name (S? '|' S? Name)* S? ')'
Перечисление — это один или несколько именных токенов, которые разделены пробелами и знаками "|". Перечисление задает несколько возможных вариантов значения атрибута, например (серый | белый).
[59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'
Значение атрибута описывается продукцией DefaultDecl следующим образом:
[60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED'
| (('#FIXED' S)? AttValue)
Определение сущности
Для того чтобы обеспечить достаточно выразительную мощность документов, XML позволяет разбивать их на отдельные поименованные объекты, называемые сущностями. Сущности в XML не имеют ничего общего с сущностями в методологии "сущность-связь". Самый близкий аналог в традиционных языках программирования — это макроподстановка.
Существует два способа определения сущности — внутреннее и внешнее.
Первый способ используется для того, чтобы определить именованный текстовый объект в самом документе, а затем использовать его содержимое посредством ссылки.
Внутреннее определение сущности имеет вид:
<!ENTITY имя "значение">
Ссылка на сущность записывается как &имя; (амперсант, затем имя сущности, затем точка с запятой).
ПримерВ документе
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE advert [
<!ENTITY animal "слон">
]>
<advert>
<product title="&animal;">
Продается настоящий &animal;!
</product>
</advert>
сущность animal имеет значение "слон". Ссылка на сущность используется дважды — в атрибуте title и в тексте элемента product. Этот документ эквивалентен документу
<?xml version="1.0" encoding="UTF-8"?>
<advert>
<product title="слон">
Продается настоящий слон!
</product>
</advert>
Если в будущем фирма переквалифицируется, и будет продавать, скажем, жирафов, можно будет, не изменяя всего документа, заменить только значение сущности:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE advert [
<!ENTITY animal "жираф">
]>
<advert>
<product title="&animal;">
Продается настоящий &animal;!
</product>
</advert>
Спецификация XML определяет несколько встроенных сущностей, которые перечислены в табл 1.1.
Таблица 1.1. Встроенные сущности XML
Имя сущности Значение Описание lt < знак "меньше" gt > знак "больше" amp & амперсант apos ' апостроф или одинарные кавычки quot " двойные кавычкиВстроенные сущности могут быть использованы для замены некоторых символов там, где они могут быть восприняты, как разметка. В частности, символы < (знак "меньше") и & (амперсант) вообще не могут появляться в тексте документа иначе, кроме как в виде сущностей.
Пример<?xml version="1.0" encoding="UTF-8"?>
<advert>
<product title="слон">
Продается серый слон весом > 5 тонн!
Компания "слон & Слон".
</product>
</advert>
На самом же деле в элементе product заключен текст
Продается серый слон весом > 5 тонн!
Компания "Слон & Слон".
Довольно часто бывает необходимо использовать в документе символы набора Unicode, обращаясь к ним по десятичным или шестнадцатеричным кодам. В таких случаях можно использовать символьные сущности.