我需要使用Apache FOP进行XSL转换,我有这样的代码:
//Setup FOP Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF,out); //Setup Transformer Source xsltSrc = new StreamSource(new File(xslPath)); Transformer transformer = tFactory.newTransformer(xsltSrc); //Make sure the XSL transformation's result is piped through to FOP Result res = new SAXResult(fop.getDefaultHandler()); //Setup input Source src = new StreamSource(new File(xmlPath)); //Start the transformation and rendering process transformer.transform(src,res);
其中xslPath是存储我的XSLT文件的路径.
我已经确认它有效,当我只有一个XSLT文件,但在我的项目中,我将事情分成几个XSLT文件,并与< xsl:import />标签.通过这种配置,我得到一个NullPointerException,因为它不能理解存储在XSLT中的所有信息,因为它分布在不同的文件上.
我想知道是否有任何方法可以在Source xsltSrc变量中加载所有这些文件,以便所有的XSL信息都可用.
UPDATE
我已经根据Mads Hansen给出的答案改变了代码,但它仍然不起作用.我必须在类路径中包含XSLT slt文件,所以我使用ClassLoader加载XSLT文件.执行url.toExternalForm()时,我已经检查过该URL的路径是否正确.这是我的新代码:
ClassLoader cl = this.getClass().getClassLoader(); String systemID = "resources/xslt/myfile.xslt"; InputStream in = cl.getResourceAsStream(systemID); URL url = cl.getResource(systemID); Source source = new StreamSource(in); source.setSystemId(url.toExternalForm()); transformer = tFactory.newTransformer(source);
它找到并加载myfile.xslt,但仍然无法解析到其他XSLT文件的相对路径.
我究竟做错了什么?
解决方法
我刚刚得到它,一个迟到的答案(测试在FOP 1.0)——
您需要的是为您的工厂设置一个uri解析器,如下所示:
TransformerFactory transFact = TransformerFactory.newInstance(); StreamSource xsltSource = new StreamSource(xsl); // XXX for 'xsl:import' to load other xsls from class path transFact.setURIResolver(new ClassPathResourceURIResolver()); Templates cachedXSLT = transFact.newTemplates(xsltSource); Transformer transformer = cachedXSLT.newTransformer(); class ClassPathResourceURIResolver implements URIResolver { @Override public Source resolve(String href,String base) throws TransformerException { return new StreamSource(XXX.getClassLoader().getResourceAsStream(href)); } }
和我导入的xsl(所以’imported.xsl’应该在类路径中):
<xsl:import href="Meta-INF/companybusinesscredit/imported.xsl"/>