Hi,
I'm using cxml as of 2006-01-05 and encounter problems with documents which refer to a local DTD. The important constraint here is that I'm working on a system on which all catalogs are old-style SGML catalogs and using XML catalogs is out. Before rolling my own entity resolver or working out a general solution using cxml:make-extid, I simply wanted to test SYSTEM ids. However, this doesn't work out as expected. I get an error from xstream-open-extid, which seems to get passed an absolute path instead of the relative path given in the doctype declaration. I.e.,
<!DOCTYPE review SYSTEM "review.dtd" >
results in
2: (XSTREAM-OPEN-EXTID #S(EXTID :PUBLIC NIL :SYSTEM #<URI file://+/review.dtd>)) Locals: SB-DEBUG::ARG-0 = #S(EXTID :PUBLIC NIL :SYSTEM #<URI file://+/review.dt>)
which is afterwards translated to /review.dtd.
I did some fairly low-level digging through the code, and think that the error is related to the following piece of code in p/doctype-decl:
(when extid (let* ((effective-extid (extid-using-catalog (absolute-extid input extid)))
I don't understand why the effective-extid is computed based on an absolute-extid -- I would have expected some test whether the path is absolute or relative. However, maybe I misinterpret something, and the comment below is related to the problem:
(defun absolute-uri (sysid source-stream) (let ((base-sysid (zstream-base-sysid source-stream))) ;; XXX is the IF correct? (if base-sysid (puri:merge-uris sysid base-sysid) sysid)))
I have an additional theory here: base-sysid is "file://+/", and indeed inspecting source-stream shows that the URI associated with it is indeed just
The object is a STRUCTURE-OBJECT of type STREAM-NAME. [type: STREAM-NAME] -------------------- ENTITY-NAME: "main document" ENTITY-KIND: :MAIN URI: #<URI file://+>
This also doesn't seem to make to much sense to me either.
However, I'm just debugging cluelessly around, so ultimately, I'm just asking for help. :-)
With kind regards,
Holger