从 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版本,但它不影响结果。如何避免这个错误?

库版本:

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);