dnfoote wrote:
> I have done some testing with a style sheet that uses the document function
> with an empty string as its only argument.  The document('') call errors out
> complaining 'SystemId Unknown' if I invoke newTransformer as follows:
> 
> Transformer transformer = tFactory.newTransformer(new StreamSource(new
> FileInputStream("media.xsl")));
> 
> instead of:
> 
> Transformer transformer = tFactory.newTransformer(new
> StreamSource("media.xsl"));

Because when you constructed the StreamSource from a FileInputStream, you
didn't set the StreamSource's system ID, which is a URI to use as the
document's ID and against which your processor's URIResolver will resolve
relative references like the '' (empty string) in that document() call.

See the StreamSource API docs and set the system ID to a full URI like
"file:///C:/path/to/media.xsl".

> Is it true that Xalan cannot reference the stylesheet document tree unless
> it got the document from a URI in the first place?

No, it's not true.

However, every document has a URI / system ID, regardless of how the document
was obtained, transmitted, or referred to in APIs. Maybe it represents where
you got the doc from, maybe not. If you didn't set one, then one was assigned
to it -- probably not very intelligently.  If you did set one, but it wasn't a
full URI, then the results are unpredictable and implementation-dependent and 
sometimes wrong, as you've observed with your test stylesheet.

> Has anyone else seen this behavior?  Is it correct?

First time I've seen it.

Even though you weren't really setting the base URI / system ID correctly,
your stylesheet shouldn't have failed.  I'd consider it a bug in Xalan, but 
others may disagree.

By the way, there's an unenforced requirement that XML namespaces be URIs,
too. They're never dereferenced or used for anything but differentiating
between element & attribute names (at least, they're not supposed to be). So
instead of xmlns:Media="Media directory lookup table.", use
xmlns:Media="http://example.com/dnfoote/media-lookup-table"; or perhaps
xmlns:Media="urn:uuid:foo" where foo is a UUID, which is essentially a string
of random hex digits, hyphen-separated in groups of 8-4-4-4-12.

Reply via email to