2010-06-18 39 views
0

是否有用於xhtml數據的內置模式數據類型?假設我想指定一個包含兩個「woozles」的「boozle」元素,每個元素都是任意的xhtml。我想寫這樣的事情,使用RELAX NG緊湊語法:html/xhtml的內置模式數據類型

namespace nifty = "http://brinckerhoff.org/nifty/" 

start = element nifty:boozle {woozle, woozle} 

woozle = element nifty:woozle {xhtml} 

不幸的是,xmllint然後通知該錯誤:

./lab.rng:43:元素參考:放鬆-NG解析錯誤:引用xhtml沒有匹配的定義 ./lab.rng:43:element ref:Relax-NG語法分析器錯誤:內部發現沒有爲ref定義xhtml

所以我的問題是這樣的:有什麼合理的,我應該把代替上面的「xhtml」?

回答

0

啊......沒關係,Relax NG文檔的更高質量的時間爲這個問題提供了兩種可能的解決方案。

1)使用的名稱類指定相匹配的一切,像這樣的「爲anyelement」:

 
anyElement = 
    element * { 
    (attribute * { text } 
    | text 
    | anyElement)* 
    } 

這是適度可怕的,因爲它僅僅關閉檢查這些元素。但是,通過這個定義,我可以將「anyElement」替換爲上面的「xhtml」。

2)在我看來,更好的解決方案將涉及使用Relax NG的「include」指令來包含xhtml的完整規範,假設我能找到它。

+0

在這裏給我自己的答案是否認爲是非常糟糕的形式? – 2010-06-18 03:05:06

+0

更好的解決方案是使用帶有多個模式驗證器的XML管道,一個用於您的命名空間,另一個用於xhtml命名空間。我在我的答案評論中鏈接到xhtml模式。 – mdma 2010-06-18 10:45:56

+0

這可能會遇到無知或頑固,但我不清楚如何將您的建議轉換爲聲明性解決方案。簡單地說:您是否建議以這樣的方式編寫Relax NG規範,以便我可以使用jing或xmllint或其他類似工具來驗證我的xml,還是建議更復雜的東西? 順便說一聲:非常感謝您的時間。 – 2010-06-18 15:58:24

0

您的woozles和boozles位於您的名稱空間中,而xhtml元素位於xhtml名稱空間中。模式驗證a命名空間 - 您的模式驗證您的命名空間,並且xhtml模式驗證xhtml命名空間。您可以通過強制所有子元素位於xhtml命名空間中來限制元素以包含xhtml,但是您的模式不應該驗證xhtml命名空間本身。

您可以使用xhtml模式驗證文檔中的任何xhtml命名空間節點。您將此架構添加到您的處理管道中,即第二個驗證步驟。

+0

我們不*連接*如果我正確理解你的意思,你建議不可能指定一個放鬆的NG模式來驗證漂亮的命名空間和xhtml命名空間的元素,這會讓我感到不幸但是似乎是合理的。但是,你是否也建議,有沒有*我可以代替上面的「xhtml」,並且我必須退回到手動編寫驗證代碼來檢查模式嗎?這是不幸的。 – 2010-06-18 01:37:09

+0

驗證分爲兩部分:在漂亮的模式中,你說woozle兒童在xhtml名字空間中。然後,您還可以使用xhtml模式(http://www.w3.org/TR/xhtml1-schema/)來驗證xhtml節點。我想最簡單的方法是使用帶有兩個模式驗證通道的xml管道 - 一個用於漂亮的relaxng模式,另一個用於xhtml w3c模式。 – mdma 2010-06-18 01:42:05

+0

Urg ...太近了。回到我原來的問題:*我放在Relax NG模式中以表明woozle兒童在xhtml命名空間中?我只是嘗試了幾個合理的猜測,沒有成功。特別是,我認爲我真正需要的是對數據類型的引用,即la xsd。 – 2010-06-18 02:36:58

1

命名空間和模式正交於RELAX NG,而它們緊密耦合在XML模式中。如果你只想驗證您的元素在XHTML命名空間,你可以建立這樣的規則:

htmlElement = element xhtml:* { (attribute * {text} | text | htmlElement)* } 

在同一行與上述爲anyelement的定義。但是如果你想實際驗證XHTML的內容,那麼你應該使用XHTML的RELAX NG模式,包含它(有多個起點,取決於你是否想要XHTML 1.0嚴格等等),然後引用它的模式html元素或任何你想要的元素。當您將完整模式包含到自己的模式中時,您需要說「包括'blahblah'{start =}以覆蓋包含的模式自己的開始符號

+0

謝謝!說得通。 – 2011-03-02 19:50:49