Этот вводный учебник не слишком вдается в подробности о том, как работают DTD, но есть еще одна основная тема, которую мы рассматриваем здесь: определение атрибутов. Вы можете определить атрибуты для элементов, появляющихся в вашем XML-документе. При помощи DTD вы можете также:
Предположим, вы хотите изменить DTD, чтобы сделать state атрибутом элемента <city>. Вот как это сделать:
<!ELEMENT city (#PCDATA)> <!ATTLIST city state CDATA #REQUIRED>
Здесь элемент <city> определяется, как и прежде, но пересмотренный пример также использует объявление ATTLIST для перечисления атрибутов элемента. Имя city в списке атрибутов сообщает парсеру, что эти атрибуты определяются для элемента <city>. Имя state является именем атрибута, а ключевые слова CDATA и #REQUIRED сообщают парсеру, что атрибут state содержит текст и является обязательным (если он не обязательный, это обеспечится при помощи CDATA #IMPLIED).
Чтобы определить много атрибутов для элемента, запишите ATTLIST, подобный такому:
<!ELEMENT city (#PCDATA)> <!ATTLIST city state CDATA #REQUIRED postal-code CDATA #REQUIRED>
Этот пример определяет и state, и postal-code как атрибуты элемента <city>.
Наконец, DTD позволяют вам определять значения по умолчанию для атрибутов и перечислять все допустимые значения для атрибута:
<!ELEMENT city (#PCDATA)> <!ATTLIST city state CDATA (AZ|CA|NV|OR|UT|WA) "CA">
Этот пример показывает, что поддерживаются только адреса из штатов Аризона (AZ), Калифорния (CA), Невада (NV), Орегон (OR), Юта (UT) и Вашингтон (WA), в штат по умолчанию - Калифорния. Таким образом, вы можете обеспечить весьма ограниченную форму проверки данных. Хотя это и полезная функция, но это лишь малое подмножество того, что вы можете проделать при помощи схем XML.