ИСПОЛЬЗОВАНИЕ АТРИБУТОВ ТИПОВ ID И IDREF




ОПРЕДЕЛЕНИЕ АТРИБУТОВ МАРКИРОВАННОГО ТИПА

При использовании атрибутов маркированного типа можно накладывать ограничения на значения атрибутов. Например, можно разрешать атрибутам принимать только одно из двух заданных значений.

Рассматривают 4 различных типа маркированных атрибутов:

ID – уникальным образом идентифицирует объект;

IDREF – указывает на элементы содержащие атрибуты ID;

ENTITIES – ссылка на внешний элемент;

NMTOKEN – содержит буквы, цифры, точки, знаки подчеркивания, перенося и двоеточия, но не пробелы.

 

ИСПОЛЬЗОВАНИЕ АТРИБУТОВ ТИПОВ ID И IDREF

Например _08, в жизни часто возникает ситуации, когда человек в течение дня делает пометки <note> в ежедневник. Каждому сообщению присваивается уникальный идентификатор number. Так же в течение дня возникают какие-либо комментарии, которые можно записывать, а можно и не записывать. Если возникает необходимость записать комментарий <comment>, его необходимо связать с соответствующей пометкой.

<?xml version= "1.0" encoding= "windows-1251"?>

<note>

<date day= "29" month= "10" year= "2007"/>

 

<time hh= "08" mm= "15" ss= "17" />

<text number= "n1" from= "Усатенко Т.Н.">

Завтра лекция по Web-дизану в 13.25

</text>

 

<time hh= "13" mm= "15" ss= "00" />

<text number= "n2" from= "Руководитель отдела">

Срочно сдать отчет

</text>

 

<comment txt= "n1">

Что важнее лекция или отчет?

</comment>

<comment txt= "n1">

Не забыть конспект

</comment>

</note>

DTD схема (primer_08_00.xml), для рассматриваемого документа будет выглядеть так:

1:<?xml version= "1.0" encoding= "windows-1251"?>

2: <!DOCTYPE note [

3: <!ELEMENT note (date*,time+, text+, comment+)*>

4: <!ELEMENT date EMPTY>

5: <!ATTLIST date

6: day CDATA #REQUIRED

7: month CDATA #REQUIRED

8: year CDATA #FIXED "2007">

9:

10:<!ELEMENT time EMPTY>

11:<!ATTLIST time

12: hh CDATA #REQUIRED

13: mm CDATA #REQUIRED

14: ss CDATA #IMPLIED>

15:

16:<!ELEMENT text (#PCDATA)>

17:<!ATTLIST text

18: number ID #REQUIRED

19: from CDATA #REQUIRED>

20:

21:<!ELEMENT comment (#PCDATA)>

22:<!ATTLIST comment

23: txt IDREF #REQUIRED>

24:

25: ]>

26:<note>

27: <date day= "29" month= "10" year= "2007"/>

28:

29: <time hh= "08" mm= "15" ss= "17" />

30: <text number= "n1" from= "Усатенко Т.Н.">

31: Завтра лекция по Web-дизану в 13.25

32: </text>

33: <comment txt= "n1">

34: Не забыть конспект

35: </comment>

36:

37: <time hh= "13" mm= "15" />

38: <text number= "n2" from= "Руководитель отдела">

39: Срочно сдать отчет. Завтра последний срок

40: </text>

41: <comment txt= "n2">

42: Что важнее лекция или отчет?

43: </comment>

44:</note>

Итак, в запись в строке 3:

<!ELEMENT note (date*,time+, text+, comment+)>

говорит о том, что элемент note должен содержать элементы date*,time+, text+, comment+, следующие в порядке их описания. Причем date может использоваться сколько угодно раз (*) или не использоваться вообще, элементы time, text, comment – должны использоваться минимум один раз. Знак (*) в конце спецификации элемента говорит о том, что группа элементов может повторятся сколько угодно раз.

В строках 5-8, 11-14, 17-19, 22 даются описания атрибутов элементов date, time, text, comment соответственно.

В строке 18 указывается, что необходимый атрибут number имеет тип ID. Это значит, что атрибут number должен быть уникальным, т.е. не использоваться только один раз.

В строке 37: отсутствует атрибут ss элемента time. Это связано с тем, что ss был объявлен как атрибут типа IMPLIED.

Совершенно по-другому должен будет выглядеть XML-документ если спецификация в строке 3 будет выглядеть следующим образом (primer_08_01.xml):

<!ELEMENT note ((date*,time+, text+), comment+)>

 

<?xml version= "1.0" encoding= "windows-1251"?>

<!DOCTYPE note [

<!ELEMENT note ((date*,time+, text+), comment+)>

<!ELEMENT date EMPTY>

<!ATTLIST date

day CDATA #REQUIRED

month CDATA #REQUIRED

year CDATA #FIXED "2007">

 

<!ELEMENT time EMPTY>

<!ATTLIST time

hh CDATA #REQUIRED

mm CDATA #REQUIRED

ss CDATA #IMPLIED>

 

<!ELEMENT text (#PCDATA)>

<!ATTLIST text

number ID #REQUIRED

from CDATA #REQUIRED>

 

<!ELEMENT comment (#PCDATA)>

<!ATTLIST comment

txt IDREF #REQUIRED>

 

]>

<note>

<date day= "29" month= "10" year= "2007"/>

 

<time hh= "08" mm= "15" ss= "17" />

<text number= "n1" from= "Усатенко Т.Н.">

Завтра лекция по Web-дизану в 13.25

</text>

 

<time hh= "13" mm= "15" />

<text number= "n2" from= "Руководитель отдела">

Срочно сдать отчет. Завтра последний срок

</text>

<comment txt= "n2">

Что важнее лекция или отчет?

</comment>

<comment txt= "n1">

Не забыть конспект

</comment>

 

</note>

А если указать в строке 3 спецификацию элемента note

<!ELEMENT note (date*,time+, text+)>,

То для правильности документа, строки следовало бы расположить так:

 

<?xml version= "1.0" encoding= "windows-1251"?>

<!DOCTYPE note [

<!ELEMENT note (date*,time+, text+, comment+)>

<!ELEMENT date EMPTY>

<!ATTLIST date

day CDATA #REQUIRED

month CDATA #REQUIRED

year CDATA #FIXED "2007"><!ELEMENT time EMPTY>

<!ATTLIST time

hh CDATA #REQUIRED

mm CDATA #REQUIRED

ss CDATA #IMPLIED>

 

<!ELEMENT text (#PCDATA)>

<!ATTLIST text

number ID #REQUIRED

from CDATA #REQUIRED>

 

<!ELEMENT comment (#PCDATA)>

<!ATTLIST comment

txt IDREF #REQUIRED>

 

]>

<note>

<date day= "29" month= "10" year= "2007"/>

 

<time hh= "08" mm= "15" ss= "17" />

<time hh= "13" mm= "15" />

 

<text number= "n1" from= "Усатенко Т.Н.">

Завтра лекция по Web-дизану в 13.25

</text>

 

<text number= "n2" from= "Руководитель отдела">

Срочно сдать отчет. Завтра последний срок

</text>

<comment txt= "n2">

Что важнее лекция или отчет?

</comment>

<comment txt= "n1">

Не забыть конспект

</comment>

</note>

 

Однако, рассмотренный в примере _08_01 XML-код противоречит структуре документа, поскольку нарушен порядок следования элементов. Это обусловлено тем, что каждое сообщение имеет свое время возникновения именно это разработчику необходимо указать. Ошибку можно было бы исправить путем введения в элемент time атрибута txt.

Теперь все элементы следуют друг за другом в том порядке, который указан в спецификации элемента note.

1: <?xml version= "1.0" encoding= "windows-1251"?>

2: <!DOCTYPE note [

3: <!ELEMENT note (date*,time+,text+, comment+)>

4: <!ELEMENT date EMPTY>

5: <!ATTLIST date

6: day CDATA #REQUIRED

7: month CDATA #REQUIRED

8: year CDATA #FIXED "2007">

9:

10: <!ELEMENT time EMPTY>

11: <!ATTLIST time

12: txt IDREF #REQUIRED

13: hh CDATA #REQUIRED

14: mm CDATA #REQUIRED

15: ss CDATA #IMPLIED>

16:

17: <!ELEMENT text (#PCDATA)>

18: <!ATTLIST text

19: number ID #REQUIRED

20: from CDATA #REQUIRED>

21:

22: <!ELEMENT comment (#PCDATA)>

23: <!ATTLIST comment

24: txt IDREF #REQUIRED>

25:

26: ]>

27: <note>

28: <date day= "29" month= "10" year= "2007"/>

29:

30: <text number= "n1" from= "Усатенко Т.Н.">

31: Завтра лекция по Web-дизану в 13.25

32: </text>

33: <text number= "n2" from= "Руководитель отдела">

34: Срочно сдать отчет

35: </text>

36:

37: <time txt= "n1" hh= "08" mm= "15" ss= "17" />

38: <time txt= "n2" hh= "13" mm= "15" />

39:

40: <comment txt= "n1">

41: Не забыть конспект

42: </comment>

43:

44: <comment txt= "n1">

45: Что важнее лекция или отчет?

46: </comment>

47: </note>

ИСПОЛЬЗОВАНИЕ ЭЛЕМЕНТОВ ENTITY В СХЕМАХ DTD

Элементы ENTITY – определяют подстановочные элементы, т.е. те элементы, содержимое которых обработчик может заменять заранее оговоренными данными. Иногда в XML такие элементы называют ссылками.

Например, в HTML подстановочными элементами являлись элементы, задаваемые спецсимволами, например, угловые скобки < > (&lt; и &gt).

Объявление ссылок или подстановочных элементов осуществляется в схеме DTD.

Наличие подстановочного элемента обработчику указывает специальные знаки & и; Указанные вначале и в конце знаки ограничивают строку, которая соответствует ссылке.

Пример. Подстановка элементов XML с использованием определений типов документов DTD.

1: <?xml version= "1.0" encoding= "windows-1251"?>

2: <!DOCTYPE note [

3: <!ELEMENT note (time+,text+, comment+)*>

4:

5: <!ELEMENT time EMPTY>

6: <!ATTLIST time

7: txt IDREF #REQUIRED

8: hh CDATA #REQUIRED

9: mm CDATA #REQUIRED

10: ss CDATA #IMPLIED>

11:

12: <!ELEMENT text (#PCDATA)>

13: <!ATTLIST text number ID #REQUIRED

14: from CDATA #REQUIRED>

15:

16: <!ELEMENT comment (#PCDATA)>

17: <!ATTLIST comment txt IDREF #REQUIRED>

18: <!ENTITY date “2 октября 2007”>

19: ]>

20: <note>

21: <time txt= "n1" hh= "08" mm= "15" ss= "17" />

22: <text number= "n1" from= "Усатенко Т.Н."> &date;

23: Завтра лекция по Web-дизану в 13.25

24: </text>

25: <comment txt= "n1">

26: Не забыть конспект

27: </comment>

28:

29: <time txt= "n2" hh= "13" mm= "15" />

30: <text number= "n2" from= "Руководитель отдела"> &date;

31: Срочно сдать отчет

32: </text>

33: <comment txt= "n1">

34: Что важнее лекция или отчет?

35: </comment>

36: </note>

На рисунке 1 представлены результаты обработки XML-кода браузером. При обнаружении в строках подстановочного элемента &date; обработчик заменяет его строкой “2 октября 2007”

Рисунок 1

Позднее мы более подробно познакомимся с подстановочными элементами и способами их применения.

ИСПОЛЬЗОВАНИЕ В СХЕМАХ DTD АТРИБУТОВ ТИПОВ С ПЕРЕЧИСЛЕНИЕМ

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

Все допустимые значения для описываемого в спецификации атрибута указываются в скобках «(», «)» через вертикальный разделитель «|». Например

<!ELEMENT date (#PCDATA)>

<!ATTLIST date day (Sunday | Monday | Thursday) “Monday”

month CDATA #REQUIRED

year CDATA #FIXED "2007">

Таким образом, согласно спецификации атрибут day может принимать только значения указанные в круглых скобках Sunday | Monday | Thursday, а по умолчанию, всегда принимать значение Monday.


<?xml version= "1.0" encoding= "windows-1251"?>

<!DOCTYPE note [

<!ELEMENT note (date*,time+, text+, comment+)>

 

<!ELEMENT date (#PCDATA)>

<!ATTLIST date

month CDATA #REQUIRED

year CDATA #FIXED "2007"

day (Sunday | Monday | Thursday) "Monday">

 

<!ELEMENT time EMPTY>

<!ATTLIST time

txt IDREF #REQUIRED

hh CDATA #REQUIRED

mm CDATA #REQUIRED

ss CDATA #IMPLIED>

 

<!ELEMENT text (#PCDATA)>

<!ATTLIST text number ID #REQUIRED

from CDATA #REQUIRED>

 

<!ELEMENT comment (#PCDATA)>

<!ATTLIST comment txt IDREF #REQUIRED>

 

]>

<note>

<date month= "10" year= "2007"/>

 

<text number= "n1" from= "Усатенко Т.Н.">

Завтра лекция по Web-дизану в 13.25

</text>

<text number= "n2" from= "Руководитель отдела">

Срочно сдать отчет

</text>

 

<time txt= "n1" hh= "08" mm= "15" ss= "17" />

<time txt= "n2" hh= "13" mm= "15" ss= "00" />

 

 

<comment txt= "n1">

Не забыть конспект

</comment>

 

<comment txt= "n1">

Что важнее лекция или отчет?

</comment>

</note>

 

Рисунок 2 – Использование типов атрибутов с перечислением

В случае, если в строке

<!ATTLIST date day (Sunday | Monday | Thursday) “Monday”

Значение, которое принимает атрибут по умолчанию, будет не соответствовать значениям, которые перечислены в скобках, обработчик немедленно выдаст ошибку (рис. 3).

 

 

Рисунок 3 – Сообщение об ошибке

В случае необходимости указать, что данный атрибут является необязательным используют объявление тип необязательного атрибута.

<!ATTLIST date day (Sunday | Monday | Thursday) #IMPLIED

month CDATA #REQUIRED

year CDATA #FIXED "2007">

 

АНАЛИЗ ПРАВИЛЬНЫХ ЭКЗЕМПЛЯРОВ

 

Объявление внешних схем DTD основное отличие внутренних и внешних схем состоит в том, что внешние схемы DTD хранятся в виде отдельного файла, а не как часть XML-документа.

До сих пор мы пользовались внутренней схемой DTD, которая задается следующим образом:

<!DOCTYPE корневой_элемент [>

<!ELEMENT корневой_элемент (модель содержания)

]>

 

Все, что указывалось в квадратах скобках, являлось внутренней схемой DTD. Внешние схемы DTD хранятся в отдельных файлах с расширением *.dtd.

Полная схема DTD для экземпляра XML состоит из комбинации внутренней и внешней схемы (если они существуют).

 

Для того, чтобы подключить внешнюю схему DTD к XML документу необходимо в строке объявления типа документа указать слово SYSTEM или PUBLIC, после которого указывается URL адрес файла, содержащего схему DTD.

PUBLIC – используется если схема общедоступна и используется многими пользователями (такие схемы хранятся в спец. библиотеке – репозитарии)

SYSTEM – используется для указания собственных схем

Например,

<!DOCTYPE корневой_элемент SYSTEM “my_dtd.dtd”>

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: