Saxon 10.3 and classpath: scheme
Added by Vladimir Nesterovsky almost 4 years ago
I have found that "classpath:" scheme does not work as I expected. I'm not sure whether it is by design or a bug, so I just put it here:
Consider a folder structure:
c:\temp\child\a.xslt
c:\temp\b.xslt
c:\temp\input.xml
a.xslt:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:include href="../b.xslt"/>
</xsl:stylesheet>
b.xslt:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xsl:stylesheet>
input.xml - is any xml
When I run a.xslt using file system it works:
java -cp Saxon-HE-10.3.jar net.sf.saxon.Transform -s:c:\temp\input.xml -xsl:C:\temp\child\a.xslt -o:c:\temp\output.xml
When I try to use "classpath:" scheme it does not work:
java -cp Saxon-HE-10.3.jar;C:\temp net.sf.saxon.Transform -s:c:\temp\input.xml -xsl:classpath:child/a.xslt -o:c:\temp\output.xml
with error:
Error on line 4 column 34 of a.xslt:
XTSE0165 I/O error reported by XML parser processing classpath:../b.xslt: unknown
protocol: classpath. Caused by java.net.MalformedURLException: unknown protocol: classpath
I/O error reported by XML parser processing classpath:../b.xslt: unknown protocol: classpath
Replies (5)
Please register to reply
RE: Saxon 10.3 and classpath: scheme - Added by Michael Kay almost 4 years ago
Saxon's standard/default URIResolver recognises the classpath scheme, but the XML parser presumably doesn't. If you want the XML parser to handle classpath URLs you'll need to customise it with your own EntityResolver.
RE: Saxon 10.3 and classpath: scheme - Added by Vladimir Nesterovsky almost 4 years ago
I know but why StandardURIResolver decides to resolve "../b.xslt" against "classpath:child/a.xslt" to "classpath:../b.xslt". After such resolution no StandardURIResolver itself nor xml parser is able to proceed.
RE: Saxon 10.3 and classpath: scheme - Added by Vladimir Nesterovsky almost 4 years ago
More correctly it's ResolveURI.makeAbsolute() called from StandardURIResolver is doing:
} else if (base.startsWith("classpath:")) {
absoluteURI = new URI(relativeURI);
if (!absoluteURI.isAbsolute()) {
absoluteURI = new URI("classpath:" + relativeURI);
}
RE: Saxon 10.3 and classpath: scheme - Added by Michael Kay almost 4 years ago
Saxon tries to handle classpath URIs wherever possible. But it can't force third-party code to handle them.
RE: Saxon 10.3 and classpath: scheme - Added by Vladimir Nesterovsky almost 4 years ago
It's Saxon's attempt to resolve <xsl:include href="../b.xslt"/>, and it builds url "classpath:../b.xslt", which does not sound right. That strange uri it sends to third-party xml API. If StandardURIResolver could resolve it to "classpath:b.xslt" then it would work.
Please register to reply