从jar加载xslt文件加载jar本身,而不是xslt
问题描述:
我有一个xslt文件在classpath里面的jar文件。我曾尝试使用InputStream加载xslt文件。一些如何在调试后,InputStream代替xslt文件包含jar文件。从jar加载xslt文件加载jar本身,而不是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}
我已经仔细检查xslt文件的路径是否正确,物理文件是否包含在jar中。任何想法的人?
答
InputStream中包含的jar文件,而不是 XSLT文件
是什么让你这么说?您是否尝试将文本内容InputStream
打印出来?在创建InputStream in
并使用它之间,你是否正在做其他事情(......部分)?
如果提供给getResourceAsStream
点到XSLT,如果is
路径是呼叫后不null
,is
应该包含代表XSLT资源InputStream
。如何粘贴整个堆栈跟踪?
答
试试这个
String pathWithinJar = "com/example/xslt/dummy.xslt";
InputStream is = java.lang.ClassLoader.getSystemResourceAsStream(pathWithinJar);
那你能给我们IOUtils(阿帕奇)或建议here一个InputStream的转换为字符串或只使用接受输入的javax.xml ... StreamSource的构造函数流。
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();
}
答
创建自定义解析从类路径来解决 组到Transfromer 测试,我在类路径Eclipse项目设定一个jar文件
所有的代码是在这里下面 -----运行示例------------- '
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();
}
}
}
`
-----------代码自定义解析--------------- `
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
`
我改变了实现这个的方式。现在在WebTier中使用ServletContext加载xslt文件。当Xslt文件不在jar中时,它可以很好地管理。在webtier中它没有问题。 – 2010-11-24 16:27:58