簡體   English   中英

文檔類型聲明和名稱空間

[英]Document type declaration and namespaces


我是XML新手,目前正在學習文檔類型聲明。 無論如何,在DTD主體中聲明元素時,元素名稱必須與XML文檔中的名稱完全一樣,包括任何名稱空間前綴,這意味着用戶無法定義自己的名稱空間,但必須使用DTD中定義的前綴。

a)我假設即使必須使用DTD中定義的前綴,我們仍然能夠選擇這些前綴指向的URI?


b)假設我們在DTD中聲明了一個元素,其中pers是名稱空間前綴,這是否意味着在XML文檔中該元素的所有出現都需要包含前綴“ pers”? 如果真是這樣,那就意味着對於DTD,我們不能使用默認的名稱空間功能嗎?


謝謝


編輯:


一種)

確實,除非有特別好的理由,或者您有簡單的語法要求並且不需要名稱空間,否則應該考慮使用XML模式。

我確實打算改用XML Schema,但我也想學習DTD的基礎。


b)

…沒有名稱空間URI的概念(也沒有默認名稱空間)。

如果我們在DTD中聲明名為“ xmlns”的屬性:

<!ATTLIST contact xmlns CDATA #REQUIRED> 


那么XML文檔可以使用默認名稱空間功能(此處子元素<name>在默認名稱空間中):

       ...
<contact xmlns=”www.somewhere.com” … > 
   <name></name>
</contact>       
       ...


謝謝

DTD根本沒有名稱空間的概念。 名稱空間概念是在其概念之后引入的。

對於XML名稱空間,重要的是名稱空間URI,而不是前綴。 用戶可以自由更改前綴。

另一方面,當在DTD中給定名稱空間“前綴”時,前綴部分僅被視為元素名稱的一部分(因為DTD沒有名稱空間概念)。 因此,不能更改“前綴”,也沒有名稱空間URI(也沒有默認名稱空間)的概念。

確實,除非有特別好的理由,或者您有簡單的語法要求並且不需要名稱空間,否則應該考慮使用XML模式。

完整的Schema規范可能讓人望而生畏,但我發現人們學到了一定的,足夠復雜的子集。 W3Schools的人們對基礎知識有很好的入門。

元素名稱必須與XML文檔中的名稱完全一樣,包括任何名稱空間前綴,這意味着用戶無法定義自己的名稱空間,但必須使用DTD中定義的前綴。

那是對的。 通過在整個DTD廣泛使用參數實體的能夠使前綴由化合物DOCTYPE的每個部分被用於任意地配置:

<!ENTITY % mydoc.prefix "mydoc:">
...
<!ENTITY % mydoc.element.qname "%mydoc.prefix;element">
<!ENTITY % mydoc.foo.qname "%mydoc.prefix;foo">
<!ENTITY % mydoc.bar.qname "%mydoc.prefix;bar">
<!ELEMENT %mydoc.element.qname; (%mydoc.foo.qname; | %mydoc.bar.qname;)>

有關如何工作的一些示例,請參見有關XHTML模塊化的工作和“ DTD XHTML 1.1 + MathML 2.0 + SVG 1.1”文檔類型。 (答案是“不是很好”。)

這是否意味着在XML文檔中此元素的所有出現都需要包含前綴“ pers”?

是的,除非您搖動DTD為不同的前綴(或無前綴)重新定義相同的元素。 盡管您可以執行此操作(甚至可以使帶有一個前綴的元素具有包含帶有另一個前綴的元素的內容模型),但是使用多個級別的參數實體進行編寫將非常痛苦,並且您的DTD最終無法讀取。

+1遵循Cumbayah的建議:如果您在此事上有任何選擇(尤其是如果您在做任何涉及名稱空間的事情),請不要使用陳舊的DTD。 任何替代方案(W3 Schema,RELAX NG,Schematron ...)都將更適合今天的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM