0

我正在尝试使用 XSLT 创建 HTML 文件,我使用 xml 文件和 xsl 文件来创建 HTML 文件。在这里,位于同一位置的其他一些 xsl 文件使用 .xsl 文件包含在 xsl 文件中<xsl:include href="temp.xsl"/>

这里 Xsl 文件位于“D:/XSL_Folder/”路径中。我正在运行位于 D:/Workspace/Webapp_Project/ 路径中的 Main.java 文件。

当我尝试通过将“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 错误 fstvv2.dao.impl.DocUnitDaoImpl - 创建文件时出错新的 XslTransformerGetter。XSL 的路径可能是错误的。javax.xml.transform.TransformerConfigurationException:无法在 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates 编译样式表(TransformerFactoryImpl.java:885)~[na:1.7.0_13]

在错误报告中,我们可以看到解析器正在检查项目路径 (D:\Workspace\Webapp_Project) 中包含的 xsl 文件,而不是 root.xsl 文件所在的路径 (D:/XSL_Folder/)。

谁能建议我为什么解析器在 root.xsl 文件所在路径的项目文件夹中搜索 xsl 文件以及如何解决此问题?

我使用 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();  
        }  
}
4

2 回答 2

0

您已将问题标记为“saxon”,并且您说您正在使用 XSLT 2.0,但错误消息显示您正在使用 Xalan。如果您特别想使用 Saxon,那么最好的方法是避免使用 JAXP 类路径搜索并直接实例化 Saxon - 代替 TransformerFactory.newInstance(),使用 new net.sf.saxon.TransformerFactory()。

提供一个 File 作为 StreamSource 的参数应该没问题;但我想看看 File lXSLFile 对象是如何创建的。我的怀疑是你做了类似新文件(“root.xsl”)的事情,并且它已经相对于当前目录解决了。

于 2013-05-23T21:15:29.430 回答
0

您可以尝试使用<xsl:include href="resolve-uri('temp.xsl')"/>代替<xsl:include href="temp.xsl"/>来避免此问题。

于 2013-05-24T05:45:04.387 回答