Andy Dingley wrote:
> How can I best make a composite DTD by including one DTD inside another
> ?
>
> There's a pre-existing DTD in an external Apache project. I'd like to
> make use of this within our internal project, suitably extended and
> wrapped. With the aid of an internal and external subset I can do
> this, as follows:
>
> <?xml version="1.0"?>
> <!DOCTYPE Container
> PUBLIC "-//Apache Software Foundation//DTD OJB Repository//EN"
> "http://db.apache.org/ojb/repository.dtd"
> [
> <!-- Wrapper element -->
> <!ELEMENT Container (jdbc-connection-descriptor) >
>
> <!-- Remove the attribute we don't want -->
> <!ATTLIST jdbc-connection-descriptor jcd-alias CDATA #IMPLIED
>>
>
> <!-- Add a couple of attributes we do want -->
> <!ATTLIST jdbc-connection-descriptor schema CDATA #IMPLIED
>>
> <!ATTLIST jdbc-connection-descriptor displayname CDATA #IMPLIED
>>
>
> ]>
> <Container>
> <jdbc-connection-descriptor
> platform="Oracle"
> jdbc-level="3.0"
> driver="@DRIVER_NAME@"
> dbalias="@URL_DBALIAS@"
> username="@USER_NAME@"
> password="@USER_PASSWD@"
> schema="@DB_SCHEMA"
> displayname="@DB_NAME"
> />
> </Container>
>
>
>
> Now obviously I don't want to have to repeat this internal subset into
> every one of our documents. I'd like to make a local DTD that
> represents this combination of internal and external subsets, as a
> single DTD that I can refer to from other documents. Is there any way
> to do this?
Create a file, e.g. my.dtd with (untested code warnings!!)
<!-- this will include the repository.dtd -->
<!ENTITY % repository.dtd
PUBLIC "-//Apache Software Foundation//DTD OJB Repository//EN"
"http://db.apache.org/ojb/repository.dtd">
repository.dtd;
<!-- add your own declarations here -->
<!-- Wrapper element -->
[...snip...]
and use it as in
<!DOCTYPE Container SYSTEM "path/to/my.dtd">
> AFAIK, it's possible to do this, but _only_ if the original DTD was
> written with that in mind (DocBook is an example) and it was already
> written as modularised components that defined entitites representing
> the DTD content and would be expanded in a wrapper DTD. Changing the
> wrapper DTD allows you to incorporate the same entities, but manipulate
> them however you like. In the simple case though, the DTD is inflexible
> except by the rather clumsy way I've done it above.
If the DTD is designed for customizations, you could declare parameter
entities before including the DTD to adjust some things to you own needs.
If the DTD is not designed for customizations, you can still add attributes,
entities, etc. but the possibilities are rather limited.
--
Benjamin Niemann
Email: pink at odahoda dot de
WWW:
http://pink.odahoda.de/