2010-11-23 6 views
0

J'ai un fichier xslt sur classpath dans le fichier jar. J'ai essayé de charger le fichier xslt en utilisant InputStream. Quelque part après debug, InputStream contient le fichier jar au lieu du fichier xslt.Charger le fichier xslt de jar charge jar lui-même à la place xslt

String xslPath = "/com/japi/application/templates/foo.xslt"; 
InputStream is = getClass().getResourceAsStream(xslPath); 
... 
Source xslt = new StreamSource(is); 
trans = factory.newTransformer(xsltSource); //Fatal error. Error parsing XSLT {0} 

J'ai vérifié deux fois ce chemin vers le fichier xslt est un fichier correct et physique dans les idées jar.Any quelqu'un?

Répondre

0

InputStream contient fichier jar à la place fichier xslt

Qu'est-ce qui vous fait dire cela? Avez-vous essayé d'imprimer le contenu du InputStream en tant que texte? Entre la création du InputStream in et son utilisation, faites-vous autre chose avec (la ... partie)?

Si le chemin d'accès fourni aux getResourceAsStream points XSLT et si is n'est pas null après l'appel, is doit contenir les éléments InputStream représentant la ressource XSLT. Que diriez-vous de coller toute la trace de la pile ici?

+1

J'ai changé la façon de l'implémenter. Maintenant, en utilisant ServletContext dans WebTier pour charger le fichier xslt. Le fichier Xslt peut être géré correctement lorsqu'il n'est pas dans le fichier jar. En webtier cela a fonctionné sans problèmes. –

1

Essayez cette

String pathWithinJar = "com/example/xslt/dummy.xslt"; 
InputStream is = java.lang.ClassLoader.getSystemResourceAsStream(pathWithinJar); 

Ensuite, vous pouvez nous IOUtils (apache) ou l'une des suggestions here pour convertir le InputStream en une chaîne ou tout simplement utiliser le javax.xml ... constructeur StreamSource qui accepte une entrée courant.

public static void transform(InputStream xslFileStream, File xmlSource, File xmlResult) 
     throws TransformerException, IOException { 

    // unknown if the factory is thread safe, always create new instance 
    TransformerFactory factory = TransformerFactory.newInstance(); 
    StreamSource xslStreamSource = new StreamSource(xslFileStream); 
    Transformer transformer = factory.newTransformer(xslStreamSource); 

    StreamSource sourceDocument = new StreamSource(xmlSource); 
    StreamResult resultDocument = new StreamResult(xmlResult); 
    transformer.transform(sourceDocument, resultDocument); 

    resultDocument.getOutputStream().flush(); 
    resultDocument.getOutputStream().close(); 
    } 
4

Création d'un résolveur personnalisé pour résoudre de chemin de classe ensemble qui à Transfromer pour tester j'avais un fichier jar situé dans classpath dans Eclipse projet

tout le code est ici-bas ----- exécuter exemple ------------- `

public class RunTransform { 

    public static void main(String[] args) { 

     // SimpleTransform.transform("xsl/SentAdapter.xsl", "C:/Amin/AllWorkspaces/ProtoTypes/XsltDemo/xml/acc.xml"); 

     SimpleTransform.transform("xslt/ibanvalidation/accuity-ibanvalidationresponse.xsl", "C:/Amin/AllWorkspaces/ProtoTypes/XsltDemo/xml/acc.xml"); 
    } 

} 

-----------Sample transfomring example ----------------

package com; 

import java.io.File; 
import java.io.FileOutputStream; 


import javax.xml.transform.Templates; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.URIResolver; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 


public class SimpleTransform { 

    public static void transform(String xslName,String xmlName) { 
     try { 
      ResourceResolver resloader = new ResourceResolver(); 
       TransformerFactory tFactory = TransformerFactory.newInstance(); 
       tFactory.setURIResolver(resloader); 

       StreamSource xsltSRC = new StreamSource(resloader.resolve(xslName)); 

       Transformer transformer = tFactory.newTransformer(xsltSRC); 

       StreamSource xmlSSRC = new StreamSource(xmlName); 
       System.out.println("Streamm sources created ....."); 

       System.out.println("XSLT SET ...."); 
       transformer.transform(xmlSSRC, new StreamResult(new FileOutputStream(new File("C:/Amin/AllWorkspaces/ProtoTypes/XsltDemo/xml/result.xml")))); 
       System.out.println("Finished transofrmation .........."); 
       System.out.println("************* The result is out in respoinse *************"); 


      } catch (Throwable t) { 
         t.printStackTrace(); 
      } 

    } 

} 

`


----------- Code pour résolveur personnalisé --------------- `

package com; 

import javax.xml.transform.URIResolver; 
import javax.xml.transform.Source; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.stream.StreamSource; 
import java.io.InputStream; 
import java.net.URL; 
import java.util.Enumeration; 
import java.util.Iterator; 

public class ResourceResolver implements URIResolver { 

    /* (non-Javadoc) 
    * @see javax.xml.transform.URIResolver#resolve(java.lang.String, java.lang.String) 
    */ 
    public Source resolve(String href, String base) throws TransformerException { 

     try { 

      InputStream is = ClassLoader.getSystemResourceAsStream(href); 
      return new StreamSource(is, href); 
     } // try 
     catch (Exception ex) { 
      throw new TransformerException(ex); 
     } // catch 
    } // resolve 

    /** 
    * @param href 
    * @return 
    * @throws TransformerException 
    */ 
    public InputStream resolve(String href) throws TransformerException { 
     try { 

      InputStream is = ClassLoader.getSystemResourceAsStream(href); 
      return is; 
     } // try 
     catch (Exception ex) { 
      throw new TransformerException(ex); 
     } // catch 
    } 
} // ResourceResolver 

`