2011-03-24 56 views
2

我正在寫一個XML結構,允許靈活的屬性名稱,像這樣的DTD:可以編寫DTD來允許任何名稱的一個或多個屬性?

<root_element> 
    <child_element> 
     <element_with_attrib iCouldbeAnything="value" defined="true" /> 
    </child_element> 
</root_element> 

因此,這裏是這個簡單的DTD:

<!ELEMENT root_element (child_element)*> 
<!ELEMENT child_element (element_with_attrib)+> 
<!ELEMENT element_with_attrib EMPTY> 
<!ATTLIST element_with_attrib 
    defined CDATA #IMPLIED 
    iCouldbeAnything CDATA #IMPLIED 
    > 

問題對XML的要求是「iCouldBeAnything」必須是任何東西。 是否可以使用DTD來描述它,還是需要依賴其他類型的XML驗證?

+0

嗯,爲什麼一個DTD,而不是一個架構? – bmargulies 2011-03-24 23:06:09

+0

好吧,DTD是XML的一種模式。我假設你在談論XSD? XSD的優點是什麼? DTD似乎被廣泛接受。 – danieltalsky 2011-03-24 23:10:50

+0

DTD遠不如W3C XML Schema和RelaxNG更靈活,更不用說schematron。對於'文檔'類型的東西,relaxng正變得非常流行,'數據'類型的東西是W3C XML Schema。要麼能輕鬆表達你想要的東西。 – bmargulies 2011-03-24 23:51:32

回答

1

AFAIK這不能用DTD完成。您需要使用其他模式語言,例如,使用<xs:anyAttribute>時,W3C XML模式允許使用靈活的屬性名稱。

更確切地說:DTD attribute list declarations需要一個屬性的名稱,並且沒有通用名稱通配符。奇怪的是,屬性聲明列表中的屬性定義是可選的,因此理論上可以有一個匿名和非類型的屬性列表聲明。

AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>' 
AttDef  ::= S Name S AttType S DefaultDecl 

所以規範允許屬性聲明一樣<!ATTLIST element-name >但似乎該規範沒有規定如何申報等應解釋,它帶任何影響或可能會允許它與任何類型的任何屬性名稱。無論如何,我不相信這樣的結構會得到很好的支持,因爲這個特徵的稀有性和偏心性。

+0

好的。從中派生出來的SGML規範需要相當於AttDef +。從理論上講,它應該沒有效果,因爲規範允許一個元素有多個ATTLIST,並且規則是隻有任何特定屬性的第一個定義計數(其餘不構成錯誤)。所以這個ATTLIST聲明對於屬性列表根本沒有貢獻。 – arayq2 2012-12-31 02:01:48

相關問題