我正在尝试使用XSLT创建HTML文件,我使用xml文件和xsl文件来创建HTML文件。这里使用<xsl:include href="temp.xsl"/>
在xsl文件中包含位于相同位置的其他一些xsl文件。
这里Xsl文件位于“D:/ XSL_Folder /”路径中。 我正在运行Main.java文件,该文件位于D:/ Workspace / Webapp_Project / path。
当我尝试通过将“D:/XSL_Folder/root.xsl”和“D:/XML_Folder/data.xml”文件作为参数传递给Main.java来创建HTML文件时,我在创建模板时遇到以下错误
Templates lTemplates = TransformerFactory.newInstance().newTemplates(new StreamSource(new FileInputStream(lFileXSL)));
错误:'D:\ Workspace \ Webapp_Project \ temp.xsl(系统找不到指定的文件)'
致命错误:'无法编译样式表' 12:20:07 ERROR f.s.t.v.v2.dao.impl.DocUnitDaoImpl - 创建新的XslTransformerGetter时出错。 XSL的路径可能是错误的。 javax.xml.transform.TransformerConfigurationException:无法编译样式表 at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:885)〜[na:1.7.0_13]
在错误报告中,我们可以看到解析器正在检查项目路径中包含的xsl文件(D:\ Workspace \ Webapp_Project),而不是root.xsl文件所在的路径(D:/ XSL_Folder /)。
有人可以建议我为什么解析器在root.xsl文件所在的路径中的项目文件夹中搜索xsl文件以及如何解决这个问题?
Code I用于通过使用XSL和XML文件创建HTML文件:
public static void simpleTransform(InputStream lXmlFileStream, File lXSLFile,
StreamResult lHtmlResult, Map<String, String> lArguments) {
TransformerFactory tFactory = TransformerFactory.newInstance();
try {
Transformer transformer =
tFactory.newTransformer(new StreamSource(lXSLFile));
for (Entry<String, String> lEntrie : lArguments.entrySet()) {
transformer.setParameter(lEntrie.getKey(), lEntrie.getValue());
}
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new StreamSource(lXmlFileStream), lHtmlResult);
}
catch (Exception e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
您已经标记了问题“saxon”,并且您说您正在使用XSLT 2.0,但错误消息显示您正在使用Xalan。如果您特别想使用Saxon,那么最好的方法是避免使用JAXP类路径搜索并直接实例化Saxon - 代替TransformerFactory.newInstance(),使用新的net.sf.saxon.TransformerFactory()。
提供文件作为StreamSource的参数应该没问题;但我想看看如何创建File lXSLFile对象。我怀疑你已经做了类似新文件(“root.xsl”)的事情,它已经相对于当前目录解决了。
答案 1 :(得分:0)
您可以尝试使用<xsl:include href="resolve-uri('temp.xsl')"/>
代替<xsl:include href="temp.xsl"/>
来避免此问题。