----- 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
_________________________________________