I am having a problem where one XSLT file imports another, causing my application to throw a MalformedURLException. The import statement in main.xsl looks like this:
<xsl:import href="transformCommon.xsl"/>
the file transformCommon.xsl is in the same folder as main.xsl. The code that attemts to load it looks like this:
private void loadXSLTFiles(String xsltFile)
{
TransformerFactory transformFactory = TransformerFactory.newInstance();
//tell the location of all of import file
transformFactory.setURIResolver(new ClassPathURIResolver());
Templates cache=null;
//cache XSLT source file for transformation reuse
InputStream is = this.getClass().getClassLoader().getResourceAsStream(xsltFile);
javax.xml.transform.Source xsltSource = new javax.xml.transform.stream.StreamSource(is);
try
{
cache = transformFactory.newTemplates(xsltSource);
}
catch (TransformerConfigurationException domException)
{
LOG.logError("XSLT initialization error has occurred: " + domException.getMessage());
}
...
The stack trace is:
Caused by: java.net.MalformedURLException
at java.net.URL.(URL.java:602)
at java.net.URL.(URL.java:465)
at java.net.URL.(URL.java:414)
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xalan.templates.StylesheetRootProxy.(Unknown Source)
... 59 more
I’m not sure why I get this error. When I remove the import from main.xsl, everything works fine. Of course, removing it is not an option as the whole point of this was to move common functions to a separate XSLT.
What’s also interesting is that only my workstation seems to have this problem. The developer who initially wrote this code says he has no problems with it. I’m using RAD 7.5. Does anyone know how this problem could come up, on a workstation-by-workstation basis?
In order to be able to resolve relative URLs in the stylesheet (including imports) the
Sourcefrom which you create theTemplatesneeds to have a “system ID” (i.e. the URL of the.xslfile).Instead of
try this:
(
openStreamcan throwIOExceptionso you’ll either need to add that to yourthrowsor wrap the whole thing in a try/catch).