muszę zrobić transformację XSL przy użyciu Apache FOP i miałem kodu:Rozwiązywanie ścieżek względnych podczas ładowania plików 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);
gdzie xslPath
jest ścieżka gdzie przechowywany jest mój plik XSLT.
Potwierdziłem, że działa, gdy mam tylko jeden plik XSLT, ale w moim projekcie podzieliłem rzeczy na kilka plików XSLT i dołączyłem je do znacznika <xsl:import />
. Dzięki tej konfiguracji otrzymuję wyjątek NullPointerException, ponieważ nie rozumie on wszystkich informacji przechowywanych w XSLT, ponieważ jest on rozprowadzany w różnych plikach.
Zastanawiam się, czy istnieje sposób, aby załadować wszystkie te pliki w zmiennej Source xsltSrc
, aby wszystkie informacje XSL były dostępne.
UPDATE
Zmieniłem kod w oparciu o odpowiedzi udzielonej przez Mads Hansen, ale nadal nie działa. Muszę uwzględnić pliki slt XSLT w ścieżce klas, więc wczytam plik XSLT z ClassLoader. Sprawdziłem, czy adres URL ma poprawną ścieżkę podczas wykonywania url.toExternalForm()
. To jest mój nowy kawałek kodu:
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);
Okazuje i ładuje myfile.xslt
ale to nadal nie rozwiązuje względnych ścieżek do innych plików XSLT.
Co robię źle?
dziękuję za odpowiedź, ale nie rozwiązuje ona mojego problemu, chociaż twoja odpowiedź ma sens. Zaktualizowałem moje pytanie, wprowadzając zmiany w kodzie. – Javi
Być może konieczne będzie uzyskanie bezwzględnej ścieżki dla identyfikatora systemowego. Chyba, że wiesz, gdzie rozwiąże względną ścieżkę "od". Spróbuj przekonwertować tę względną ścieżkę do bezwzględnej ścieżki za pomocą czegoś takiego: 'String xsltSystemId = new File (systemID) .toURL(). ToExternalForm();' lub 'String xsltSystemId = new Plik (relativePath) .getAbsolutePath();' –
thanks , Już to zrobiłem i sprawdziłem, że kiedy robię url.toExternalForm(), otrzymuje on absolutną ścieżkę. Ale nie wiem, gdzie teraz jest problem. – Javi