我需要做的使用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