Элементы description, paragraph и general
Следующая часть DTD определяет элементы, дочерние по отношению к product. Дочерний элемент name в настоящий момент может содержать любую разновидность проверенных символьных данных, что вполне соответствует нашим требованиям. Элемент description, определенный таким же образом, содержит информацию, исходно предназначенную для прочтения людьми, но также в нем могут содержаться некоторые данные, которые мы хотели бы сделать доступными для программ, то есть которые можно было бы извлекать автоматически.
Чтобы сделать содержимое элемента description удобным для восприятия и для применения к нему в дальнейшем различных стилей, нужно предусмотреть возможность разделения элемента description на части, которые будут содержать элементы для отображения текста жирным шрифтом, курсивом и т. д. Для этого в первую очередь нужно, чтобы элемент description мог содержать элементы paragraph, и определить paragraph, как это сделано ниже [Paragraph — абзац (имеется в виду просто некая часть текста), bold — полужирный (шрифт), italics — курсив, quote — цитата, link — ссылка — Примеч перев ]:
<!ELEMENT description (paragraph*)>
<!ELEMENT paragraph (#PCDATA | bold |
italics|quote|link)*>
<!ELEMENT bold #PCDATA>
<!ELEMENT italics #PCDATA>
<! ELEMENT quote #PCDATA>
<!ATTLIST quote
attrib CDATA #IMPLIED>
<!ELEMENT link (#PCDATA)>
<!ATTLIST link
href CDATA «REQUIRED
alt CDATA #IMPLIED>
Существует большая вероятность того, что такой же список элементов разметки, который используется в элементе paragraph, потребуется в каком-то другом месте DTD (например, в элементе title или footnote, то есть в заголовке или в сноске). Чтобы упростить процесс создания DTD, мы ввели параметрическую сущность, представляющую собой список элементов разметки текста:
<!ENTITY %runmng_text "(#PCDATA | bold |
italics | quote | link)* ">
СОВЕТ
Напомним, что сущность — просто подстановочный текст, который пишется вместо заменяемого им значения, и что общие и параметрические сущности должны быть объявлены прежде, чем будут использованы. Поскольку параметрические сущности могут существовать только в DTD, то обычно их объявления сгруппированы в начале DTD. В нашем случае это тем более удобно, что при необходимости добавления какого-либо элемента разметки в элемент paragraph эту сущность будет легко найти.
Когда объявление параметрической сущности добавлено в начало DTD, объявление элемента paragraph можно переписать следующим образом:
<!ELEMENET paragraph %running_text;>
Если параметрическая сущность применяется правильно, это повышает удобочитаемость определения DTD и способствует его многократному использованию. Но будьте осторожны — так же, как следует избегать излишнего усложнения элементов, вам нужно сопротивляться искушению всюду вводить параметрические сущности. Если их окажется слишком много или они будут неправильно использоваться, пострадает удобочитаемость DTD.
Вторая цель переработки элемента description — обеспечить возможность автоматического извлечения из этих описаний содержательной информации. Для этого мы должны иметь возможность использовать другие элементы внутри элемента description. Предположим, что в нашем каталоге имеется следующий элемент description:
<description>
<paragraph>Эта яркая новая группа из Бельгии,
звучание которой можно определить как смесь
Iggy Pop и Spice Girls,стремительно завоевывает
популярность во всем мире.</paragraph>
</description>
Было бы замечательно, если бы наша схема позволила приложению использовать различные фрагменты этого описания для ссылок на близкие по назначению товары. Проблема же заключается в том, что в описание могут быть включены тысячи различных типов данных. Мы могли бы попытаться создать подробный список возможных фрагментов данных, которые могут встретиться в описании. Но это привело бы к созданию огромного по размерам объявления элемента, в котором было бы невозможно разобраться.
Хорошим способом обойти эту проблему является использование элемента general с атрибутом type. Идентифицирующую информацию можно сделать значением этого атрибута, что дает максимальную гибкость автору документа и тому, кто конструирует разметку элемента description, как видно из приведенного ниже листинга:
<!ELEMENT general #PCDATA>
<!ATTLIST general
type CDATA #REQUIRED>
Используя элементы general и paragraph, мы можем теперь разметить описание (то есть элемент description) в нашем примере таким образом, чтобы информацию из него могли извлечь и человек, и программа:
<description>
<paragraph>Эта яркая новая группа из
<general type="country">Бельгии</general>,
звучание которой можно определить как смесь
<general type="artist">Iggy Pop</general>и
<general type = "artist">Spice Girl</general>
стремительно завоевывает популярность во всем
мире.</paragraph>
</description>
Теперь приложение легко справится с задачей преобразования элементов general в пары имя-значение.
В результате объявление элемента description и его дочерних элементов будет выглядеть следующим образом:
<!ELEMENT description (paragraph|general)* >
<!ELEMENT paragraph %running_text;>
<!ELEMENT bold #PCDATA>
<!ELEMENT italics #PCDATA>
<!ELEMENT quote #PCDATA>
<!ATTLIST quote
attrib CDATA #IMPLIED>
<!ELEMENT link (#PCDATA)>
<!ATTLIST link
href CDATA #REQUIRED
alt CDATA #IMPLIED>
<!ELEMENT general #PCDATA>
<!ATTLIST general
type CDATA #REQUIRED>