(Примечание: в принципе, я бы согласился с использованием XSD вместо DTD (в качестве альтернативы используйте RelaxNG , который является хорошей стандартизированной альтернативой XSD и гораздо более коротким, а также гораздо более простым для понимания и читайте.) Не беспокойтесь слишком о расширенном коде. Он довольно прост для чтения и дает вам мощную выразительную силу. Вместо того, чтобы быть заблокированным технологией, он поможет вам создать то, что вам нужно. IDE, такие как Visual Studio , Eclipse и другие имеют инструменты графического дизайна для построения вашей модели, что делает создание XSD проще простого.)
Но это не отвечает на ваш вопрос. Это довольно легко повторно использовать определение в DTD. Посмотрите на HTML DTD s, это происходит постоянно. Ключ заключается в использовании параметров объектов. Вот простой пример:
<!-- the "model" -->
<!ENTITY % commoncontent
"content | xxx">
<!ENTITY % commonattrs
"att1 CDATA #IMPLIED
att2 CDATA #IMPLIED">
<!-- elements -->
<!ELEMENT root ANY>
<!ELEMENT content ANY>
<!ELEMENT xxx EMPTY>
<!-- elements that share the same model -->
<!ELEMENT hello (%commoncontent;)+>
<!ELEMENT world (%commoncontent;)+>
<!-- adding the attributes to the elements with the same model -->
<!ATTLIST hello %commonattrs;>
<!ATTLIST world %commonattrs;>
, который в основном делает элементы hello
и world
, содержит точно такой же набор атрибутов и содержимого. В качестве содержимого я использовал определение необязательных и неупорядоченных элементов, что делает следующий XML-документ действительным с указанным выше DTD:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "multipleSharedDefinitions.dtd">
<root>
<hello att1="bla">
<content />
</hello>
<world att1="bla" att2="blabla">
<content />
<xxx />
</world>
</root>