2011-08-02 35 views
4

HTML5草案specifies(目前至少),URI about:legacy-compat可用於依賴符合XML的doctype(其中<!DOCTYPE html> isn 「T)。如何在XSLT處理器中使用HTML5的「about:」協議

所以我碰巧有HTML5驗證的XML文件,與啓動包:

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

不幸的是,當我用這樣的XHTML5文檔與任何XSLT處理器一樣的Xalan或撒克遜人,他們自然試試解決(無法解析的)URI。

有什麼辦法可以讓他們忽略URI或者在底層隱藏它嗎?嘗試解決它在這些文檔的早期發生,所以例如撒克遜的-dtd:off開關在這裏沒有效果。

編輯:低級別的方法sed -n '2,$p' <htmlfile> | otherapp遺憾的是僅適用,直到我開始使用document() XPath函數加載另一個XHTML5文件。

編輯2:我玩弄XML catalogs,讓他們與薩克森和Xalan一起工​​作。然而,然後我總是得到一個

java.net.MalformedURLException: unknown protocol: about 

嗯,這並不奇怪,但我怎麼能繞過這個?永遠不應該解析URL,只是扔掉。

+0

你想用xslt實現什麼?你要從html5轉到..?基本上,任何東西, – Wivani

+0

。在特定情況下,使用FOP(Xalan)處理XSL-FO,並使用XSLT2和Saxon分割* more * HTML5。 – Boldewyn

+0

但是我更關心基本的「如何解決URI的解決方案」這個基本問題:「URL」,而不是特定的XSLT問題。這只是我的用例。 – Boldewyn

回答

4

將這個.java文件到$ somepath /富/約/

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:

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

這是一個修改後的shell腳本腳本(對於* nix系統,但它對Windows非常相似):

#!/bin/sh 

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

如果它不起作用,您可能需要使用本地saxonb-xslt腳本進行修改。

+0

我被'無效選項卡住:-Djava.protocol.handler.pkgs = foo'錯誤。 Java版本是1.6.0_22,OpenJDK。類路徑相應地設置。不知道這與它有什麼關係:編譯它時說:'注意:foo/about/Handler.java使用或覆蓋棄用的API。「這基本上是關於使用java.io.StringBufferInputStream'的投訴。 。 – Boldewyn

+0

你如何啓動你的程序?你不能做「saxonb-xslt --Djava.protocol.handler.pkgs = foo -cp $ somepath whataver」。您必須修改/複製saxonb-xslt腳本 – ysdx

+0

'java -cp「$ somepath:/usr/share/java/xalan2.jar」org.apache.xalan.xslt.Process -Djava.protocol.handler.pkgs = foo -indent 2 -xsl stylesheet.xsl -in in.xml -out out.xml' – Boldewyn