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

стр.

Количество, с которым элемент может появляться в этой последовательности, формально записывается с использованием символов-модификаторов ">*", ">?", ">+", которые имеют следующие значения:

□ >а? — означает, что элемент может быть пропущен в последовательности;

□  — означает, что элемент должен присутствовать в последовательности на этом месте ровно один раз;

□ >а* — задает последовательность из нуля или более элементов ;

□ >a+ — задает последовательность из одного или более элементов .

Кроме того, содержимое может моделироваться как перечисление и выбор элементов.

Элементы перечисляются через запятую в круглых скобках, например >(a, b, c) — это последовательность, состоящая из элементов >a, >b, >c. Такая запись означает, что первым должен идти элемент >a, затем сразу же за ним элемент >b и элемент >c.

Выбор элемента задается аналогично перечислению, только разделительным символом является не запятая, а знак '>|'. Например, (>a | b | c) задает выбор одного из трех элементов >a, >b или >c.

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

Пример

>(a* | b? | с | d+)

определяет содержимое, как последовательность, состоящую из нуля или более элементов >aили одного элемента >b, который может быть пропущен, или ровно одного элемента , или последовательностью, состоящей из одного или более элементов >d.

Помимо этого, формальные правила могут использовать при записи другие формальные правила.

Пример

>((a | b), (с | d))

задает содержимое, первым элементом которого является >a или >b, вторым — элемент или >d.

Содержимое элементов может также включать символьные данные, которые обозначаются при помощи ключевого слова >#PCDATA (parsable character data — разбираемые символьные данные).

Пример

>

означает, что элемент >product должен содержать только символьные данные.

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

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

Пример

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

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

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

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

□ элемент >classified не имеет содержимого.

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

Листинг 1.4

>

>

>

>

>

>]>

>

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

>

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

>[45] elementdecl ::= ''

Нетерминал >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? ')'

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

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

>элемент

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

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

> и т. д...>

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