tôi cần phải làm một biến đổi XSL sử dụng Apache FOP và tôi đã có mã như thế này:Giải quyết đường dẫn tương đối khi tải file 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);
nơi xslPath
là con đường nơi tập XSLT của tôi được lưu trữ.
Tôi đã xác nhận rằng nó hoạt động khi tôi chỉ có một tệp XSLT, nhưng trong dự án của tôi, tôi đã chia mọi thứ thành nhiều tệp XSLT và nối chúng với thẻ <xsl:import />
. Với cấu hình này, tôi nhận được một NullPointerException vì nó không hiểu tất cả các thông tin được lưu trữ trong XSLT bởi vì nó được phân phối trên các tệp khác nhau.
Tôi tự hỏi liệu có cách nào để tải tất cả các tệp này trong biến số Source xsltSrc
để tất cả thông tin XSL có sẵn hay không.
CẬP NHẬT
Tôi đã thay đổi mã dựa trên câu trả lời được đưa ra bởi Mads Hansen, nhưng nó vẫn không hoạt động. Tôi phải bao gồm các tệp slt XSLT trong classpath, vì vậy tôi tải tệp XSLT bằng ClassLoader. Tôi đã kiểm tra xem URL có đường dẫn chính xác không khi thực hiện url.toExternalForm()
. Đây là đoạn mã mới của tôi:
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);
Tìm và tải myfile.xslt
nhưng vẫn không giải quyết được đường dẫn tương đối cho các tệp XSLT khác.
Tôi đang làm gì sai?
cảm ơn câu trả lời của bạn, nhưng dường như không giải quyết được vấn đề của bạn, mặc dù câu trả lời của bạn có ý nghĩa. Tôi đã cập nhật câu hỏi của mình với các thay đổi trong mã. – Javi
Bạn có thể cần có đường dẫn tuyệt đối cho SystemID của mình. Trừ khi bạn biết nơi nó sẽ được giải quyết con đường tương đối "từ". Hãy thử chuyển đổi đường dẫn tương đối thành một đường dẫn tuyệt đối với một cái gì đó như: 'String xsltSystemId = new File (systemID) .toURL(). ToExternalForm();' hoặc 'String xsltSystemId = new File (relativePath) .getAbsolutePath();' –
thanks , Tôi đã mặc dù trong đó và tôi đã kiểm tra rằng khi tôi làm url.toExternalForm() nó được một con đường tuyệt đối. Nhưng bây giờ tôi không biết vấn đề ở đâu. – Javi