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

Errors creating html file using xml and xsl file (xslt 2.0) (Recoverable error I/O error reported by XML parser processing)

我正在使用下面的代码从 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

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

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

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

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

你似乎不太可能从同一个 运行 得到这些,所以不清楚你在每次这些情况下做了什么导致两个不同的错误。

第一个错误意味着由于某种原因您加载了不支持 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。