How do I declare attributes common to multiple elements?

dtd, xml

Solution

Each element needs to have its own attribute declaration (`ATTLIST`). However, you can use a parameter entity to reuse the bulk of it.

Example...

<!ENTITY % attrs 
    'width   CDATA   "0"
     height  CDATA   "0"
     margin  CDATA   "0 0 0 0"
     padding CDATA   "0 0 0 0"
     rotation CDATA  "0"
     halign  (left|center|right|full)    "center"
     valign  (top|middle|bottom|full)    "middle"'>

<!ELEMENT elem1 (#PCDATA)>
<!ATTLIST elem1 %attrs;>

<!ELEMENT elem2 (#PCDATA)>
<!ATTLIST elem2 %attrs;>

Here's another example that has a mix of the parameter entity references along with attributes that only appear on the individual elements.

<!ELEMENT elem1 (#PCDATA)>
<!ATTLIST elem1 
    attr1 CDATA #IMPLIED
    %attrs;              >

<!ELEMENT elem2 (#PCDATA)>
<!ATTLIST elem2 
    attr2 CDATA #IMPLIED
    %attrs;              >

Problem

I have multiple elements I want to give these attributes: ``` <!ATTLIST [all these elements] width CDATA "0" height CDATA "0" margin CDATA "0 0 0 0" padding CDATA "0 0 0 0" rotation CDATA "0" halign (left|center|right|full) "center" valign (top|middle|bottom|full) "middle" > ``` Is this possible somehow in DTD, or will I have to do it manually? (Also, while I'm here, I don't think it was such a good idea to declare the `margin` and `padding` attributes that way. Does anyone know a better way?)

Original source