----- Original Message -----
Sent: Saturday, August 23, 2003 8:35
AM
Subject: xinclude funnies
I'll preface this with "I'm a bit new to digging
around in Xerces and XInclude". (Xerces always worked, but then I wasn't
using new, beta features.)
I'm trying to make Saxon 7.6.5 (XSLT) work with
Xerces 2.5.0 (tarball not recent cvs) using XInclude and SAX with my
own XMLEntityResolvers/EntityResolvers. Saxon has it's own issues but
that's for another mailinglist. Once upon a time, I would preprocess my
files with Elliot Rusty Harold's Xincluder from SourceForge into a separate
XML. Now I'd like to stream it in situ. (that means that the input
files are understandable by elharo's implementation so they are less
suspect). The trick is to change the OS based file references into
arbitrary key references.
Here is what I understand. My questions
follow.
Soon after hitting the include element,
org.apache.xerces.xinclude.XIncludeHandler.handleIncludeElement(XMLAttributes attributes) is called. He
creates a XMLResourceIdentifier with an explicit null public id and an
explicit null expanded system id (the literal system id is retrieved
from the href and represents a relative "file". This is what I used to
use with XIncluder). When he determines that there is, indeed, a resolver, he calls
EntityResolverWrapper holding my resolver. First the wrapper checks that
the public id and system id (the expanded one) are not null. They are so
he exits immediately.
I "fixed" this using
XMLEntityManager.expandSystemId() to produce the expanded system id
in handleIncludeElement where the XMLResourceIdentifier is first
created.
Now with the EntityResolverWrapper getting a
reasonable system id, my resolver gets a reasonable id and it attempts to
load the first xinclude. The system id's are now a mixture of my keys
and file bases. My entity resolver is completely memory based so the
file based URI's are confusing. For example:
In the old system running from the file system
there were three files
With the elharo xincluder, main.xml had
<xi:include
href=""/> and abc.xml contained <xi:include href=""/>. My Resolver
receives file:///c:/home/npitman/part1/subpart1/abc.xml. It gets the "file:///c:/home/npitman/"
part from the running location of the application. XMLEntityManager
noticed that the base system id of "main.xml" was null so he assumed that he
would need a real URI and that should be based on the current working
directory. In the memory-based situation, the hrefs are not so
much URI's as keys. I'm expecting just "part1/subpart1/abc.xml".
This is what I find in the literal system
id. Unfortunately, this helps little because the first include xincludes
a second. This has an href of "helper.xml". In my key system, I'd
expect to see "part1/subpart1/helper.xml".
Questions:
1) What is going on in
org.apache.xerces.xinclude.XIncludeHandler.handleIncludeElement? Setting the id's to null can't be
right.
2) Is there a way to accept a blank base system
id?
I'd like href="" within "main.xml" to try to
resolve "part1/subpart1/abc.xml" and href="" within
"part1/subpart1/abc.xml" to try to resolve "part1/subpart1/help.xml".
3) Alternately, is the there an extension
mechanism, like the EntityResolver, to externalize expandSystemId()?
I suppose that the fallback would be to set the base system id of
main.xml to an abitrary scheme like "npitman://" and the look up
"npitman://part1/subpart1/abc.xml" and
"npitman://part1/subpart1/helper.xml"
Thanks for your
patience in reading.
_________________________________________
Neil
Pitman
[EMAIL PROTECTED]+1.514.863.5465
ICQ#:
21101052
_________________________________________