Я думаю, что это простой вопрос, но после поиска я не нашел никакого решения. Есть ли способ определить глобальные атрибуты в XML DTD, чтобы быть доступным всем элементом?Определение глобальных атрибутов в XML
ответ
Если вы спрашиваете, у вас может быть один ATTLIST
, который применяется к нескольким элементам, ответ - нет. The attribute list declaration must only have a single name. Нет никакого способа обойтись вокруг, имея ATTLIST
для каждого элемента с атрибутами.
Однако вы можете использовать parameter entity для повторного использования определений атрибутов в объявлениях объявлений нескольких атрибутов. Это упростит поддержание общих атрибутов.
Вот пример. В примере есть два атрибута: attr1
и attr2
, которые являются общими для элементов elem1
и elem2
. Эти элементы также имеют атрибуты, unique-attr1
и unique-attr2
соответственно, которые являются уникальными для этих элементов.
so.dtd
<!ENTITY % common-attrs
"common1 CDATA #REQUIRED
common2 CDATA #REQUIRED">
<!ELEMENT test (elem1,elem2)>
<!ELEMENT elem1 EMPTY>
<!ATTLIST elem1
%common-attrs;
unique1 CDATA #REQUIRED>
<!ELEMENT elem2 EMPTY>
<!ATTLIST elem2
%common-attrs;
unique2 CDATA #REQUIRED>
Вот пример того, что экземпляр XML будет выглядеть следующим образом:
so.xml
<!DOCTYPE test SYSTEM "so.dtd">
<test>
<elem1 common1="x" common2="x" unique1="x"/>
<elem2 common1="x" common2="x" unique2="x"/>
</test>
ПРИМЕЧАНИЕ: Использование ссылок объектов параметров в декларациях разметки, l ike, я делаю выше, разрешен только во внешнем подмножестве (внешнем DTD); а не во внутреннем подмножестве (внутренний DTD). (Как внутренние, так и внешние подмножества обсуждаются в том же разделе спецификации ссылка ниже).
От spec:
Well-formedness constraint: PEs in Internal Subset
In the internal DTD subset, parameter-entity references must not occur within markup declarations; they may occur where markup declarations can occur. (This does not apply to references that occur in external parameter entities or to the external subset.)
Вы можете использовать шаблон проектирования XML: Общие атрибуты
спасибо за решение. Можно ли обойти это ограничение, используя несколько DTD или что-то в этом роде? –
Нет. Я не вижу, как несколько DTD помогут. Во время обработки может применяться только один DTD. Вы можете разделить DTD на отдельные файлы и использовать объекты параметров (с системными идентификаторами) для их ссылки, но это не позволяет достичь того, чего вы пытаетесь достичь; вы просто модулируете свой DTD. –
Спасибо за комментарий. –