Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:
Пример

<!ELEMENT product (#PCDATA)>

означает, что элемент

product
должен содержать только символьные данные.

Помимо текста элементы могут также включать в себя другие элементы. Содержимое такого типа называется смешанным. Формальные правила смешанного содержимого должны всегда иметь вид

(#PCDATA | ... | ... ) *
.

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

Пример

Предположим,

мы хотим определить документ со следующей логической структурой:

□ корневым элементом документа является элемент

advert
;

□ элемент

advert
содержит последовательность, состоящую из нескольких элементов product и одного элемента
classified
, который может быть пропущен;

□ элемент

product
может содержать текст и другие элементы
product
в любом порядке;

□ элемент

classified
не имеет содержимого.

Документ соответствующей логической структуры может быть задан следующим образом.

Листинг 1.4

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE advert [

<!ELEMENT advert (product+, classified*)>

<!ELEMENT product (#PCDATA | product)*>

<!ELEMENT classified EMPTY>

]>

<advert>

 <product>

Покупайте наших слонов!

 </product>

 <classified/>

</advert>

Определению элемента соответствует EBNF-продукция

elementdecl
:

[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'

Нетерминал

contentspec
, следующий через пробельное пространство за именем элемента, определяет тип содержимого, которое может иметь этот элемент:

[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

Строка "

EMPTY
" соответствует пустому элементу, "
ANY
" — любому содержимому, нетерминал
Mixed
— смешанному содержимому,
children
— содержимому, которое определяется формальными правилами.

[47] children ::= (choice | seq) ('?' | '*' | '+')?

[48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?

[49] choice ::= '(' S? cp ( S? '|' S? cp )+ S? ')'

[50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'

[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'

| '(' S? '#PCDATA' S? ')'

Определение списка атрибутов

Список атрибутов некоторого элемента задается следующим образом:

<!ATTLIST элемент

 атрибут1 тип1 значение1

 атрибут2 тип2 значение2

 и т. д...>

В этом определении

элемент
задает имя элемента, для которого определяется
данный список атрибутов,
атрибут
— имя атрибута,
тип
— тип атрибута и
значение
— значение атрибута.

Имя
атрибута отвечает в 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
, за которым следует значение, заключенное в кавычки — это задает атрибут, который всегда должен иметь одно и то же фиксированное значение;

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

Поделиться с друзьями: