Bug 60950

Summary: JSTL TransformSupport XSL import not finding relative path
Product: Taglibs Reporter: Tomaz Cerar <tomaz.cerar>
Component: XTags TaglibAssignee: Tomcat Developers Mailing List <dev>
Status: RESOLVED FIXED    
Severity: normal CC: tomaz.cerar
Priority: P2    
Version: 1.2.5   
Target Milestone: ---   
Hardware: PC   
OS: All   
Attachments: Reproducer war
Patch that passes URI resolver to newTransformer
Thread Safe Patch that passes URI resolver to newTransformer

Description Tomaz Cerar 2017-04-03 14:09:15 UTC
Created attachment 34894 [details]
Reproducer war

When you try to use references to local xslt files inside same deployment.
You can get error when creating XML Transformer as transformer factory doesn't have URI resolver set to be able to recognize jstl protocol.

Reproducer "test.war" is attached.
Part of code that makes it fail:

test.jsp:
------------
<c:import var="xslStylesheet" url="/xsl/style.xsl" charEncoding="UTF-8" />
<c:import url="http://localhost:8080/test/test.xml" var="doc"/>
<x:transform xml="${doc}" xslt="${xslStylesheet}" xsltSystemId="/xsl/">
</x:transform> 

style.xsl
---------------
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                version="1.0">

    <xsl:import href="parent.xsl"/>
...

results in
javax.xml.transform.TransformerException: Had IO Exception with stylesheet file: parent.xsl
	   at org.apache.xalan.processor.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:942)
	   at org.apache.xalan.processor.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:780)
	   at __redirected.__TransformerFactory.newTransformer(__TransformerFactory.java:133)
   at org.apache.taglibs.standard.util.XmlUtil.newTransformer(XmlUtil.java:187)
Caused by: java.net.MalformedURLException: unknown protocol: jstl
   at java.net.URL.<init>(URL.java:600)
   at java.net.URL.<init>(URL.java:490)
   at java.net.URL.<init>(URL.java:439)
   at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:964)
   at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:144)
   at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:832)
   at org.apache.xerces.parsers.XML11Configuration.parse(XML11Configuration.java:798)
   at org.apache.xerces.parsers.XMLParser.parse(XMLParser.java:108)
   at org.apache.xerces.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1198)
   at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:564)
   at org.apache.xalan.processor.ProcessorInclude.parse(ProcessorInclude.java:312)

This is also tracked in Red Hat BZ https://bugzilla.redhat.com/show_bug.cgi?id=1320747
as well as in WildFly Jira: https://issues.jboss.org/browse/WFLY-8498
Comment 1 Tomaz Cerar 2017-04-03 14:12:25 UTC
Created attachment 34895 [details]
Patch that passes URI resolver to newTransformer

Proposed patch passes URI resolver to XmlUtil#newTransformer.
so it is set on TRANSFORMER_FACTORY before new transformer is created.
Comment 2 Tomaz Cerar 2017-04-03 14:51:07 UTC
Created attachment 34896 [details]
Thread Safe Patch that passes URI resolver to newTransformer
Comment 3 Remy Maucherat 2017-04-03 16:26:03 UTC
Reviewed and committed as r1790020, it will be in the next (1.2.6 ?) release.