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 永远不应该被解析,而应该被丢弃。
将此 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 脚本进行调整。