Résolution des chemins relatifs lors du chargement des fichiers XSLT
J'ai besoin de faire une transformation XSL à l'aide d'Apache FOP et j'ai eu un code comme ceci:
//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);
où xslPath
est le chemin où mon fichier XSLT est stockée.
J'ai confirmé qu'il fonctionne lorsque je n'ai qu'un fichier XSLT, mais dans mon projet, j'ai divisé les choses en plusieurs fichiers XSLT et s'est joint à eux avec la <xsl:import />
tag. Avec cette configuration, j'obtiens une exception NullPointerException parce qu'il ne comprend pas toutes les informations stockées dans XSLT parce qu'il est distribué dans différents fichiers.
Je me demande si il y a moyen de charger tous ces fichiers dans le Source xsltSrc
variable de sorte que tout le XSL information est disponible.
Mise à JOUR
J'ai modifié le code en fonction de la réponse donnée par Mads Hansen, mais cela ne fonctionne toujours pas. - Je inclure le XSLT slt les fichiers dans le chemin de la classe, donc je charge le fichier XSLT avec chargeur de classe. J'ai vérifié que l'URL a le chemin d'accès correct lors de l'exécution de url.toExternalForm()
. Ceci est mon nouveau morceau de code:
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);
Il détecte et charge myfile.xslt
mais ça ne fonctionne toujours pas résoudre les chemins relatifs pour les autres fichiers XSLT.
Ce que je fais mal?
source d'informationauteur Javi
Vous devez vous connecter pour publier un commentaire.
Je viens de recevoir, une réponse tardive(testé sur FOP 1.0) ------
Tous vous avez besoin est de définir une uri de résolution pour votre usine, suivant fonctionne pour moi:
et ma importation xsl(de sorte que le " importés.xsl " doit être dans le classpath):
Lorsque vous chargez un XSLT comme un StreamSource et de ne pas définir une Idsystèmele processeur ne sait pas "où" le XSLT est et ne peut pas résoudre les chemins d'accès relatifs.
http://www.onjava.com/pub/a/onjava/excerpt/java_xslt_ch5/index.html?page=5
Je suis en utilisant Saxon 9.x et toujours eu des problèmes quand j'ai utilisé le document au sein de la feuille de style. La feuille de style a été correctement réglé, mais les xmls regroupés avec la feuille de style dans le fichier jar ne se charge pas comme prévu, même avec setSystemId. Il en est résulté un fichier non trouvé exception. Il était plus facile pour moi de code personnalisé que l'outil de résolution avec le code ci-dessous: