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