Hi Carron,
Frame's XML parser needs a way to find the DTD and it's components when XML is read/written to/from Frame.
If public identifiers are used in XML declaration in an XML instance.
Example (let's use dita, it also uses modular dtd's). a topic xml file declaration looks like (w/o tag delimiters):
!DOCTYPE task PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd"
If the instance and the dtd file (topic.dtd) are in a same folder, the parser is able to use it right away. This is not the case usually, so frame must "help" the parser to figure out where the physical file "topic.dtd" is in the file system.
This is done with the public identifier "-//OASIS//DTD DITA Topic//EN" definition in the structapps.fm.
It is possible to use absolute paths with system identifiers, but that approach makes portability a pain in the neck.
During write, writer rw-rule can be used to re-create the doctype declaration. Here, only the main dtd needs to be reconstructed.
Now, the DTD might be modular, like in case of dita. In the DTD file, the external file entity definitions are like this:
!ENTITY % ui-d-dec PUBLIC
"-//OASIS//ENTITIES DITA User Interface Domain//EN"
"uiDomain.ent"
so again, a public identifier and system identifier (+the entity name).
and they are "invoked" with line:
%ui-d-dec;
in the dtd
If the entity file is in the same folder as the main dtd, parser is able to find it. If not, you need to tell the location in structapps.fm
In "normal" XML systems, these things are handled with XML catalogs, but frame uses the structapps-approach.
The html-extension...hmmm...did you get the dtd through email..in some cases the mail sw thinks that the dtd modules are html and adds the extension. Typically the extensions are either ent or mod (well, they can be anything.., parser does not care)
So, shortly...yes, you are on the right track..;)
Hope this helps,
Martti