Технология 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
не имеет содержимого.
Документ соответствующей логической структуры может быть задан следующим образом.
>
>
>
>
>
>]>
>
>
> Покупайте наших слонов!
>
>
>
Определению элемента соответствует 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
> и т. д...>
В этом определении >элемент
задает имя элемента, для которого определяется данный список атрибутов,