Упрощайте DTD
Не делайте определение DTD настолько сложным, чтобы его нельзя было легко и просто прочитать. Чем легче для чтения и понимания будет ваше DTD, тем оно окажется полезнее. Если вы разрабатываете DTD для очень специализированной области применения, оно неизбежно будет сложнее, чем DTD для обычного каталога товаров. В листинге 2.8 представлены два определения DTD, причем второе выполняет те же функции, хотя гораздо проще первого [Phone call — телефонный звонок, valid phone digits — допустимые телефонные символы, from — от, to — кому, content — содержимое, phone number — телефонный номер, digit — цифра (символ), dash — тире, caller — вызывающий абонент, answerer — отвечающий абонент — Примеч. перев. ].
Листинг 2.8. Два возможных DTD для описания телефонного звонка.
<!—DTD для элемента phone_call-->
<!ENTITY % valid jihone_ch gits '"
(1|2|A|B|C|3|D|E|F|4|G|H|I|5|J|K|L|6|M|N|
0|7|P|R|S|8|T|U|V|9|W|X|Y|0)">
<'ELEMENT phone_call (from*.to*,content)>
<!ELEMENT from (phone_number)>
<!ELEMENT phone_number ((dig!t?,digit'.digit?,dash?)?,
digit, digit, digit, dash, digit, digit,digit,digit)>
<!ELEMENT digit EMPTY> <!ATTLIST digit number
%valid_phone_dlgits; #REQUIRED>
<!ELEMENT dash EMPTY>
<!ATTLIST dash
value CDATA #FIXED "-">
OELEMENT to (phone_number)> <iELEMENT content
(caller|answerer)*> <'ELEMENT caller (#PCDATA)>
<!ELEMENT answerer (#PCDATA)>
<!—упрощенное определение DTD для элемента phone_call-->
<!ELEMENT phone_call (from*,to*,content)>
<!ELEMENT from EMPTY> <!ATTLIST from
phone_number CDATA #REQUIRED>
<!ELEMENT to EMPTY>
<!ATTL1ST to phone_number CDATA #REQUIRED>
<!ELEMENT content (caller|answerer)*>
<!ELEMENT caller (#PCDATA)>
<!ELEMENT answerer (#PCDATA)>
В большинстве случаев достаточно использовать второе, упрощенное определение DTD, так как первое является слишком сложным. Сколько потребуется времени, чтобы разобраться в нем и понять, что это всего лишь определение обычного телефонного номера? В данном случае возможная область применения DTD, несомненно, преувеличена. Нужно ли нам на самом деле выделять каждую цифру телефонного номера? Может быть, данный пример несколько утрирован, но он иллюстрирует основную идею' не злоупотребляйте подробностями при создании DTD или документов XML. Здесь существует некий предел, переход за который может оказаться губительным.