Might I suggest that everybody proposing table DTDs consider at
least reading the CALS one.... It definitely has warts, the biggest
in my view being excessive complexity; on the other hand it has been
implemented about a dozen independent times, and shown to work and
be very flexible. If provides good control of rules -- actually
more powerful than proposed above, and not much more complicated.
Why start all over when we can start from experience and
improve on it? At the very least, seeing how it's done before
will introduce one to a wider range of possibilities.
You can nab the CALS DTD from the site below, and ignore 99% of it
(just locate '<!ELEMENT (table', it's near the end -- don't forget