在XSLT转换中加载XSL文件和DTD文件时出错

时间:2013-05-23 09:54:46

标签: xslt-2.0 saxon xalan

我正在尝试使用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();  
        }  
}

2 个答案:

答案 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"/>来避免此问题。

相关问题