Assembling composite DTDs

Discussion in 'XML' started by Andy Dingley, Jun 2, 2006.

  1. Andy Dingley

    Andy Dingley Guest

    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?

    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.

    Is this the best I can do? Should I look at a port to XML Schema
    instead?

    Apologies for the x-post to c.i.w.a.h, but the traffic there catches
    the eyeballs of some people whose opinion I'd respect on this.
     
    Andy Dingley, Jun 2, 2006
    #1
    1. Advertising

  2. Andy Dingley <> wrote:
    > AFAIK, it's possible to do this, but _only_ if the original DTD was
    > written with that in mind


    I believe that's correct.


    --
    () ASCII Ribbon Campaign | Joe Kesselman
    /\ Stamp out HTML e-mail! | System architexture and kinetic poetry
     
    Joe Kesselman, Jun 2, 2006
    #2
    1. Advertising

  3. 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/
     
    Benjamin Niemann, Jun 2, 2006
    #3
  4. Andy Dingley

    Andy Dingley Guest

    Benjamin Niemann wrote:
    > Create a file, e.g. my.dtd with (untested code warnings!!)


    With the tiny change (typo?) of adding "%" to the entity reference, I
    think that's doing the trick
    Tested with jEdit's validator so far.

    <!ENTITY % repository.dtd
    PUBLIC "-//Apache Software Foundation//DTD OJB Repository//EN"
    "http://db.apache.org/ojb/repository.dtd" >
    %repository.dtd;

    Thanks very much! My problem appears solved and I learned something
    about DTDs.
     
    Andy Dingley, Jun 2, 2006
    #4
  5. Andy Dingley

    Peter Flynn Guest

    Peter Flynn, Jun 3, 2006
    #5
  6. Henri Sivonen, Jun 3, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Rogue Chameleon
    Replies:
    6
    Views:
    352
  2. Malte

    jar assembling tool ...?

    Malte, Apr 23, 2005, in forum: Java
    Replies:
    9
    Views:
    781
    JScoobyCed
    Apr 25, 2005
  3. Clifford W. Racz
    Replies:
    4
    Views:
    2,039
    Clifford W. Racz
    Feb 13, 2004
  4. William Park

    [script] dis/assembling mbox email

    William Park, Jun 10, 2004, in forum: Python
    Replies:
    5
    Views:
    812
    William Park
    Jun 11, 2004
  5. JAKE

    Assembling a string

    JAKE, Feb 23, 2006, in forum: C Programming
    Replies:
    31
    Views:
    987
    Chris Torek
    Feb 25, 2006
Loading...

Share This Page