Доработка DTD
После внимательного изучения этого определения DTD его недостатки становятся очевидными, и мы начинаем понимать, что требуется внести ряд исправлений. Первый недостаток заключается в том, что у нас нет способа однозначно идентифицировать записку. Во-вторых, следовало бы более подробно указать, что может содержаться в элементах from и to. В-третьих, возможны ситуации, когда записки посылаются не от одного, а от нескольких лиц или нескольким лицам. Обдумав, какие виды записок реально могут пересылаться между служащими фирмы, мы переделали DTD (листинг 2.2 [Name — название, department — отдел, important part — наиболее существенная часть. — Примеч. перев. ]).
Листинг 2.2. Исправленное определение DTD для записок (memo.dtd)
<!ELEMENT memo (from, to, cc?, body)>
<!ATTLIST memo
id ID «REQUIRED
date CDATA «REQUIRED
subject CDATA #IMPLIED>
<!ELEMENT from (name.department)*>
<!ELEMENT to (name,department)*>
<!ELEMENT cc (name,department)*>
<!ELEMENT name (#PCDATA)>
<!ELEMENT department (#PCDATA)>
<!ELEMENT body (#PCDATA,important_part?)>
<!ELEMENT important_part (#PCDATA)>
Используя это определение DTD, любой сотрудник фирмы XMLGifts может точно ответить на вопрос, что такое служебная записка В листинге 2 3 показана правильно оформленная и допустимая служебная записка
Листинг 2.3. Правильно оформленная и допустимая служебная записка (memoexamplel.xml)
<?xml version="l.0" standalone="no"?>
<!DOCTYPE memo SYSTEM "memo.dtd">
<memo id = "cm0001"
date = "8/2/2000"
subject = "ваша задача на сегодня">
<from>
<name>Крис Минник</name>
</from>
<to>
<department>Bceм coтpyдникaм</department>
</to>
<body>
Поздравляю с окончанием проекта XMLGnfts.com
Предлагаю <important_part>сделать выходной и поехать на озеpo</important_part>
</body>
</memo>
Этот метод — изучение реального образца данных и последующее исправление DTD с учетом возможных потребностей в будущем — мы и будем использовать при создании каталога товаров для сайта XMLGifts.com
В листинге 2 4 приводится первый черновой вариант документа XML, описывающего несколько товаров из будущего каталога для сайта XMLGifts.com Этот документ написан без DTD Он является правильно оформленным документом XML, но, поскольку никакому определению DTD он не соответствует, его нельзя назвать допустимым и самодокументируемым [Caption — подпись (к рисунку) productlme — серия товаров — Примеч перев ].
Листинг 2.4. Первая черновая попытка описания товаров
<?xml version="1.0"?>
<catalog>
<product_line name="Books">
<product id="bk0022">
<name>Guide to Plants</name>
<description>Everything you've ever wanted to know about plants. </descnption>
<price>$12 99</price>
<quantity_in_stock>4</quantity_in_stock>
<image width="234" height="400"
src="images/covers/plants.gif ">
<caption>
This is the cover from the first edition
</caption>
</image>
<onsale_date>12/23/1999</onsale_date>
</product>
<product id="bk0035">
<name>Writing Fake Catalogs</name>
<description>Chns Hinnick's latest book explains, in agonizing detail, the process of thinking up fake products for a demonstration catalog </description>
<pnce>$59.95</pnce>
<quantity_in_stock>30</quantity_in_stock>
<onsale_date>09/01/2000</onsale_date>
</product>
</product_line>
<product__line name="CDs'>
<product id="cd0024">
<name>Just Singin' Along</name>
<description>A lovely collection of songs that the whole family can sing right along with </description>
<price>$10 00</price>
<quantity_in_stock>100</quantity_in_stock>
<onsale_date>2/23/2000</onsale_date>
</product>
<product id="cd0025">
<name>It' s Dot Com Enough for Me Songs from Silicon
Somewhere</name>
<description>A collection of the best folk music from
Internet companies.
</descnption>
<clip format="mp3" length="4.32" size="4.0 Mb"
src="track2.mp3">
<title>Track 2: My B2B Is B-R-0-K-E</title>
</clip>
<onsale_date>4/12/2000</onsale_date>
</product>
</product_line>
<product_line name="widgets">
<product id="wi0026">
<name>ElectroThermal Oxidizor</name>
<description>This amazing gizmo uses electricity to
produce heat that can be used for oxidization
purposes.</description>
<price>$24.95</price>
<quantity_in_stoek>10</quantity_in_stock>
<image width="200" height="200" src="/images/toaster.gif">
</image>
<onsale_date>6/2/2000</onsale_date>
</product>
<product id="wz0027">
<name>Percusive Interface Unit</name>
<description>Communicate with your favorite electric
calculating machine through tapping!</description>
<price>$109.99</price>
<quantity_in_stock>7</quantity_in_stock>
<onsale_date>6/23/200K/onsale_date>
</product>
</product_line>
</catalog>