从 XML 到 HTML 的 XSLT 转换结果 "HTML 1.0 version not supported" 错误
XLST transform from XML to HTML results "HTML 1.0 version not supported" error
我正在尝试使用 Java Saxon 库和 Jcabi-XML.
将 XML 转换为 HTMl
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" version="5.0"/>
<xsl:template match="/content">
<html lang="en">
<head></head>
<body></body>
</html>
</xsl:template>
</xsl:stylesheet>
XML:
<?xml version="1.0"?>
<content>This text results error</content>
Java:
package com.test;
import java.io.File;
import java.io.FileNotFoundException;
import com.jcabi.xml.XMLDocument;
import com.jcabi.xml.XSLDocument;
public class Main {
public static void main(String... args) {
try {
final XMLDocument xml = new XMLDocument(
new File("test.xml")
);
final XSLDocument xlst = new XSLDocument(
new File("test.xslt")
);
xlst.transform(xml);
} catch (final FileNotFoundException ex) {
System.out.println(ex.getMessage());
}
}
}
此代码结果 java.lang.IllegalArgumentException: net.sf.saxon.trans.XPathException: Unsupported HTML version: 1.0
。
我明确设置了HTML5版本,但它不影响结果。如何避免这个错误?
库版本:
- Jcabi-XML:
0.23.2
- 撒克逊-HE:
9.8.0-15
将 xmlns="http://www.w3.org/1999/xhtml"
添加到 xsl:stylesheet
标签修复了这个错误:
更改后的完整 XSLT 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
version="2.0">
<xsl:output method="html" version="5.0"/>
<xsl:template match="/content">
<html lang="en">
<head></head>
<body></body>
</html>
</xsl:template>
</xsl:stylesheet>
据我从堆栈跟踪中可以看出(显示
Exception in thread "main" java.lang.IllegalArgumentException: net.sf.saxon.trans.XPathException: Unsupported HTML version: 1.0
at com.jcabi.xml.XMLDocument.asString(XMLDocument.java
异常是由行 https://github.com/jcabi/jcabi-xml/blob/0.23.2/src/main/java/com/jcabi/xml/XMLDocument.java#L505 执行 trans.setOutputProperty(OutputKeys.VERSION, "1.0");
触发的,这似乎是罪魁祸首。
所以基本上看来该库将 Saxon 与 JAXP Transformer API 一起使用,但在那一行试图将 version
覆盖为 1.0
并且 Saxon 确实不支持它对于 HTML 输出,它试图根据样式表中设置的 html
输出方法进行输出。
因为您想使用 Saxon 9.8(或者可能更高版本,因为支持的版本是 10 和 11),我建议查看 https://www.saxonica.com/documentation11/index.html#!using-xsl/embedding/s9api-transformation 中记录的 Saxon 的 API 并使用API 执行 XSLT 转换。
Processor processor = new Processor(false);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable stylesheet = compiler.compile(new StreamSource(new File("test.xslt")));
Serializer out = processor.newSerializer(new File("result.html"));
Xslt30Transformer transformer = stylesheet.load30();
transformer.transform(new StreamSource(new File("test.xml")), out);
我正在尝试使用 Java Saxon 库和 Jcabi-XML.
将 XML 转换为 HTMlXSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html" version="5.0"/>
<xsl:template match="/content">
<html lang="en">
<head></head>
<body></body>
</html>
</xsl:template>
</xsl:stylesheet>
XML:
<?xml version="1.0"?>
<content>This text results error</content>
Java:
package com.test;
import java.io.File;
import java.io.FileNotFoundException;
import com.jcabi.xml.XMLDocument;
import com.jcabi.xml.XSLDocument;
public class Main {
public static void main(String... args) {
try {
final XMLDocument xml = new XMLDocument(
new File("test.xml")
);
final XSLDocument xlst = new XSLDocument(
new File("test.xslt")
);
xlst.transform(xml);
} catch (final FileNotFoundException ex) {
System.out.println(ex.getMessage());
}
}
}
此代码结果 java.lang.IllegalArgumentException: net.sf.saxon.trans.XPathException: Unsupported HTML version: 1.0
。
我明确设置了HTML5版本,但它不影响结果。如何避免这个错误?
库版本:
- Jcabi-XML:
0.23.2
- 撒克逊-HE:
9.8.0-15
将 xmlns="http://www.w3.org/1999/xhtml"
添加到 xsl:stylesheet
标签修复了这个错误:
更改后的完整 XSLT 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
version="2.0">
<xsl:output method="html" version="5.0"/>
<xsl:template match="/content">
<html lang="en">
<head></head>
<body></body>
</html>
</xsl:template>
</xsl:stylesheet>
据我从堆栈跟踪中可以看出(显示
Exception in thread "main" java.lang.IllegalArgumentException: net.sf.saxon.trans.XPathException: Unsupported HTML version: 1.0
at com.jcabi.xml.XMLDocument.asString(XMLDocument.java
异常是由行 https://github.com/jcabi/jcabi-xml/blob/0.23.2/src/main/java/com/jcabi/xml/XMLDocument.java#L505 执行 trans.setOutputProperty(OutputKeys.VERSION, "1.0");
触发的,这似乎是罪魁祸首。
所以基本上看来该库将 Saxon 与 JAXP Transformer API 一起使用,但在那一行试图将 version
覆盖为 1.0
并且 Saxon 确实不支持它对于 HTML 输出,它试图根据样式表中设置的 html
输出方法进行输出。
因为您想使用 Saxon 9.8(或者可能更高版本,因为支持的版本是 10 和 11),我建议查看 https://www.saxonica.com/documentation11/index.html#!using-xsl/embedding/s9api-transformation 中记录的 Saxon 的 API 并使用API 执行 XSLT 转换。
Processor processor = new Processor(false);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable stylesheet = compiler.compile(new StreamSource(new File("test.xslt")));
Serializer out = processor.newSerializer(new File("result.html"));
Xslt30Transformer transformer = stylesheet.load30();
transformer.transform(new StreamSource(new File("test.xml")), out);