Выбор элемента задается аналогично перечислению, только разделительным символом является не запятая, а знак '
|
'. Например, (
a | b | c
) задает выбор одного из трех элементов
a
,
b
или
c
.
При записи выбора и перечисления элементы могут также указываться с использованием модификаторов количества.
Пример
(a* | b? | с | d+)
определяет содержимое, как последовательность, состоящую из нуля или более элементов
a
или
одного элемента
b
, который может быть пропущен, или ровно одного элемента
с
, или последовательностью, состоящей из одного или более элементов
d
.
Помимо этого, формальные правила могут использовать при записи другие формальные правила.
Пример
((a | b), (с | d))
задает содержимое, первым элементом которого является
a
или
b
, вторым — элемент
с
или
d
.
Содержимое элементов может также включать символьные данные, которые обозначаются при помощи ключевого слова
#PCDATA
(parsable character data — разбираемые символьные данные).
Пример
<!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
— содержимому, которое определяется формальными правилами.
Список атрибутов некоторого элемента задается следующим образом:
<!ATTLIST элемент
атрибут1 тип1 значение1
атрибут2 тип2 значение2
и т. д...>
В этом определении
элемент
задает имя элемента, для которого определяется данный список атрибутов,
атрибут
— имя атрибута,
тип
— тип атрибута и
значение
— значение атрибута.
Имя
атрибута отвечает в XML тем же самым требованиям, что и имя элемента — оно должно начинаться с буквы и может содержать другие буквы, цифры и некоторые знаки препинания.