First of all, at this point in history we should be charitable to the
various XML processors, which have had to track the successive versions
of the spec.
Having said that, as recently reported, we changed the rules to do
two things:
(a) simplify the internal subset (only simple PE's, which can be
ignored by a non-validating processor)
(b) require all conforming processors to use <!ATTLIST and internal
<!ENTITY declarations in the internal subset
So, barring any last-second changes, you can send a chunk of XML
containing an internal subset to any conforming XML processor, and
expect it to do your attribute defaults and entity replacements
properly.
Lark serves as proof-by-existence that this need not slow down a
processor too drastically. In fact, speaking from personal experience,
it's not even that hard. -T.