Как использовать протокол about5 в HTML5 в процессорах XSLT - PullRequest
4 голосов
/ 02 августа 2011

Черновик HTML5 указывает (по крайней мере, на данный момент), что URI about:legacy-compat может использоваться для документов, которые основаны на XML-формате, соответствующем XML (а не <!DOCTYPE html>).

Итак, у меня есть пакет проверяющих HTML5 XML-файлов, которые начинаются с:

<!DOCTYPE html SYSTEM "about:legacy-compat">

К сожалению, когда я использую такой документ XHTML5 с любым XSLT-процессором, таким как Xalan или Saxon, они, естественно, пытаются разрешить (неразрешимый) URI.

Есть ли способ заставить их игнорировать URI или искусственно разрешать его под капотом? Попытка разрешить это происходит в этих документах раньше, поэтому, например, переключатель Saxon -dtd:off здесь не действует.

Редактировать: Низкоуровневый подход sed -n '2,$p' <htmlfile> | otherapp, к сожалению, работает только до тех пор, пока я не начну использовать document() функцию XPath для загрузки другого файла XHTML5.

Редактировать 2: Я поигрался с XML-каталогами и заставил их работать как с саксонским, так и с шаланским. Однако тогда я всегда получаю

java.net.MalformedURLException: unknown protocol: about

Ну, это не удивительно, но как я могу обойти это? URL никогда не должен анализироваться, просто выбрасываться.

1 Ответ

4 голосов
/ 26 августа 2011

Поместите этот файл 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;
 }
}

Теперь перейдите в $ somepath и скомпилируйте его:

javac foo/about/Handler.java

Добавьте следующие аргументы в JVM при вызове Saxon:

-Djava.protocol.handler.pkgs=foo -cp"$somepath"

Вот модифицированный скрипт сценария оболочки (для * nix системы, но он очень похож на Windows):

#!/bin/sh

exec java -Djava.protocol.handler.pkgs=foo -classpath /usr/share/java/saxonb.jar:"$somepath" net.sf.saxon.Transform "$@"

Возможно, вы захотите адаптироваться, используя ваш локальный скрипт saxonb-xslt, если он не работает.

...