使用xml和xsl文件创建html文件时出错(xslt 2.0)(XML解析器处理报告的可恢复错误I / O错误)

时间:2016-10-13 19:40:10

标签: java xml xslt saxon

我使用下面的代码从xml和xsl文件生成html。它适用于xslt 1.0,但现在我正在使用xslt 2.0。我在执行以下代码时遇到此错误:ERROR: Unsupported XSL element 'for-each-group'.'

你知道如何解决这个问题吗?

private static void createHtml(){
        try {
            TransformerFactory tf =TransformerFactory.newInstance();    
            Source xslFile =new StreamSource("test.xsl");
            Source xmlFile =new StreamSource(new StringReader(xml));

            String resultFile ="test.html";

            OutputStream htmlFile=new FileOutputStream(resultFile );
            Transformer trasform=tFactory.newTransformer(xslFile);
            trasform.transform(xmlFile, new StreamResult(htmlFile));
        }
        catch (Exception e)
        {
            System.out.println("Error.");
        }
 }

我现在试着这样做:

TransformerFactory tfactory = TransformerFactory.newInstance();

Transformer transformer = tfactory.newTransformer(new StreamSource(new File("test.xsl")));

transformer.transform(new StreamSource(new File(xml)),
                new StreamResult("test.html"));

在主要方法中:

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl")

我收到了这个错误:

Recoverable error 
  I/O error reported by XML parser processing

知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您报告了两个不同的错误:

(a)错误:不支持的XSL元素'for-each-group'。'

(b)可恢复错误:XML解析器处理报告的I / O错误

你似乎不太可能从同一次运行得到这些,所以不清楚你在这些场合每次做什么来得到两个不同的错误。

第一个错误意味着由于某种原因您加载了不支持XSLT 2.0的XSLT处理器。确保加载Saxon的最安全,最快捷的方法是直接实例化它:

TransformerFactory tfactory = new net.sf.saxon.TransformerFactoryImpl();

如果您依赖JAXP机制,可能会出现各种各样的问题,而且它也可能非常慢,因为它涉及搜索类路径。

出现第二个错误,您没有提供足够的信息来提供完整的诊断。然而,消息中没有文件名的事实给出了一个线索:这意味着Saxon不知道文件名,这通常是因为你做了类似的事情:

Source xmlFile =new StreamSource(new StringReader(xml));

StringReader本身永远不会出现I / O错误。但是,如果要解析的XML包含DTD引用或对其他外部实体的引用,并且这些是相对引用,则XML解析器将无法解析它们,因为它没有基本URI可用用。您可以在StreamSource构造函数的第二个参数中提供基URI。