如何在 XSLT 处理器中使用 HTML5 的“about:”协议

Bol*_*wyn 5 html xml uri saxon

HTML5 草案指定(至少目前如此),URIabout:legacy-compat可用于依赖于符合 XML 的文档类型(但事实<!DOCTYPE html>并非如此)的文档。

所以我碰巧有一组 HTML5 验证 XML 文件,其开头为:

<!DOCTYPE html SYSTEM "about:legacy-compat">
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我将这样的 XHTML5 文档与任何 XSLT 处理器(如 Xalan 或 Saxon)一起使用时,它们自然会尝试解析(无法解析的)URI。

有什么方法可以让他们忽略 URI 或在幕后进行虚假解析吗?解决这个问题的尝试发生在这些文档的早期,因此例如 Saxon 的-dtd:off切换在这里不起作用。

编辑:不幸的是,低级方法sed -n '2,$p' <htmlfile> | otherapp只有在我开始使用document()XPath 函数加载另一个 XHTML5 文件时才有效。

编辑 2:我尝试了XML 目录,并让它们能够与 Saxon 和 Xalan 一起使用。然而,然后我总是得到

java.net.MalformedURLException: unknown protocol: about
Run Code Online (Sandbox Code Playgroud)

嗯,这并不奇怪,但是我怎样才能避免这个问题呢?URL 永远不应该被解析,而应该被丢弃。

ysd*_*sdx 4

将此 Java 文件放入 $somepath/foo/about/ 中

package foo.about;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringBufferInputStream;
import java.net.URL;
import java.net.URLConnection;

public class Handler extends java.net.URLStreamHandler {

@Override
protected URLConnection openConnection(URL url) throws IOException  {               
    URLConnection res = new URLConnection(url) {

        @Override
        public void connect() throws IOException {
            connected = true;
        }
        @Override
        public InputStream getInputStream() throws IOException {
            return new StringBufferInputStream("<!ELEMENT html ANY>");
        }
    };
    return res;
 }
}
Run Code Online (Sandbox Code Playgroud)

现在进入 $somepath 并编译它:

javac foo/about/Handler.java
Run Code Online (Sandbox Code Playgroud)

调用 Saxon 时向 JVM 添加以下参数:

-Djava.protocol.handler.pkgs=foo -cp"$somepath"
Run Code Online (Sandbox Code Playgroud)

这是一个修改后的 shell 脚本(适用于 *nix 系统,但它与 Windows 非常相似):

#!/bin/sh

exec java -Djava.protocol.handler.pkgs=foo -classpath /usr/share/java/saxonb.jar:"$somepath" net.sf.saxon.Transform "$@"
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,您可能需要使用本地 saxonb-xslt 脚本进行调整。