Книга: Технология XSLT
Определение элемента
Разделы на этой странице:
Определение элемента
Определение элемента задает имя и тип содержимого элемента в следующем виде:
<!ELEMENT имя содержимое>
Имя элемента должно начинаться с буквы, подчеркивания ("_
") или двоеточия (":
") и содержать буквы, цифры, некоторые знаки пунктуации (такие, как "_
" — подчеркивание, ":
" — двоеточие, ".
" — точка, "-
" — тире или знак минуса) и модифицирующие символы (см. разд. "Базовые продукции ХМL" данной главы).
Примером имени элемента может быть "A
", "B:12
", "MyEasyName
", "doc.xml
".
В качестве содержимого элемента может быть указано:
? EMPTY
, в случае, когда элемент обязан быть пустым;
? ANY
, в случае, когда элемент может содержать что угодно;
? формальное правило, определяющее элементы, и данные, которые может содержать элемент, а также порядок их следования.
Первые два случая определения элемента довольно просты. Их использование может быть продемонстрировано на следующем примере:
Декларация
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
определяет документ с корневым элементом advert
, в котором могут встречаться также элементы product
и classified
, причем элементы advert
и product
могут содержать любые данные и любые из объявленных элементов, а элемент classified
всегда должен быть пустым.
Приведем пример документа, построенного в соответствии с этой декларацией.
Листинг 1.3. Документ с декларацией типа
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE advert [
<!ELEMENT advert ANY>
<!ELEMENT product ANY>
<!ELEMENT classified EMPTY>
]>
<advert>
<product>
Покупайте наших слонов!
</product>
<classified/>
</advert>
В третьем случае содержимое элемента определяется при помощи формальных правил, которые очень похожи на те, которые используются в расширенных формах Бэкуса-Наура. Подобно тому, как в EBNF формальные правила используются для того, чтобы стандартизировать последовательность символов, составляющую конструкции некоторого языка, в определениях элементов они используются для описания содержимого элемента — последовательности из символьных данных и дочерних элементов.
Количество, с которым элемент может появляться в этой последовательности, формально записывается с использованием символов-модификаторов "*
", "?
", "+
", которые имеют следующие значения:
? а?
— означает, что элемент а
может быть пропущен в последовательности;
? а
— означает, что элемент а
должен присутствовать в последовательности на этом месте ровно один раз;
? а*
— задает последовательность из нуля или более элементов а
;
? 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 — разбираемые символьные данные).
Пример
<!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? ')'
- 3.2. Определение горизонтальных и вертикальных ограничений на языке визуального форматирования
- Понятие опорного элемента
- II. ОПЕРАЦИЯ КОСВЕННОГО ПОЛУЧЕНИЯ ЭЛЕМЕНТА: ->
- Определение границ массива
- 8.1.3. Определение размера массива
- 15.8.2. Определение геометрии элемента
- 15.8.3. Определение элемента в указанной точке
- 1.2. Определение количества информации. Единицы измерения количества информации
- Определение версии клиента
- Определение пользовательского формата числовых данных
- Определение целей. Построение цепочек
- Письма с элементами графики и вложениями