8

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?)

Community
  • 1
  • 1
Sammi De Guzman
  • 567
  • 9
  • 20

1 Answers1

10

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;              >
Daniel Haley
  • 51,389
  • 6
  • 69
  • 95
  • @MichałKrzysztofFeiler - Take a look at [oXygen XML Editor](https://www.oxygenxml.com/). It's not free, but it's worth every penny. They also have an evaluation license and an academic license. – Daniel Haley Feb 26 '20 at 22:18
  • It appears that not only `xmllint` doesn't accept that, but using these in XML given to Firefox or Chrome also results in errors… Firefox straight out says it is an illegal parameter entity reference, Chrome gives a result more similar to the one from `xmllint` – Mika Feiler Mar 04 '20 at 00:06