我需要做的使用Apache FOP XSL转换的时候,我有这样的代码解决相对路径:加载XSLT文件
//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
我已经改变了基于由马德斯·汉森给出的答案代码,但它仍然无法正常工作。我必须在类路径中包含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文件中的相对路径。
我在做什么错?
感谢您的回答,但它似乎无法解决我的问题,尽管您的答案很有意义。我用代码中的更改更新了我的问题。 – Javi 2010-09-15 10:06:08
您可能需要获取SystemID的绝对路径。除非你知道它将在哪里解决相对路径“from”。尝试将该相对路径转换为类似以下内容的绝对路径:'String xsltSystemId = new File(systemID).toURL()。toExternalForm();'或'String xsltSystemId = new File(relativePath).getAbsolutePath();' – 2010-09-15 11:04:21
thanks ,我已经在那里,我已经检查,当我做url.toExternalForm()它获得一个绝对路径。但我不知道现在的问题在哪里。 – Javi 2010-09-15 11:40:50