2015-02-05 4 views

ответ

1

Если вы спрашиваете, у вас может быть один 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.)

+0

спасибо за решение. Можно ли обойти это ограничение, используя несколько DTD или что-то в этом роде? –

+0

Нет. Я не вижу, как несколько DTD помогут. Во время обработки может применяться только один DTD. Вы можете разделить DTD на отдельные файлы и использовать объекты параметров (с системными идентификаторами) для их ссылки, но это не позволяет достичь того, чего вы пытаетесь достичь; вы просто модулируете свой DTD. –

+0

Спасибо за комментарий. –

Смежные вопросы