2011-07-14 79 views
2

有人可以請解釋爲什麼兩個報價行是必要的 <!DOCTYPE grammar PUBLIC "-//W3C//DTD GRAMMAR 1.0//EN" "http://www.w3.org/TR/speech-grammar/grammar.dtd">?這是來自官方SRGS(http://www.w3.org/TR/speech-grammar/)文件,第2.7節。人們會認爲只是後面的引用行注意到dtd的位置就夠了。我懷疑這與用英文指定語言有關,但文件沒有解釋這一點。謝謝。注意DTD在語音語法xml(SRGS)

回答

2

如果XML文檔應該對DTD有效,則只有後一個字符串(系統標識符)必須存在。

第一個帶引號的字符串是公共標識符,它是可選的。它用於通過名稱而不是物理地址來唯一標識DTD(或其他外部標識符)。通常可以認爲公共標識符比http:file: URL更穩定。即使系統標識符錯誤或互聯網訪問停止(例如),也可以找到DTD。

這將是確定只使用

<!DOCTYPE grammar SYSTEM "http://www.w3.org/TR/speech-grammar/grammar.dtd"> 

注意使用SYSTEM關鍵字在這種情況下。

另請參閱http://www.xml.com/axml/target.html#sec-external-ent

關於W3C承載的DTD的使用,您可能對http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic/感興趣。

+0

謝謝@ mzjn,爲您的深入解釋和非常有用的鏈接。 – nlper

1

實際上在SGML(這是XML的基礎)URL(= SYSTEM標識符)與PUBLIC標識符的可選方式相同。如果存在關鍵字PUBLIC,則應始終使用與您的案例中給定的正式公共標識符(FPI)"-//W3C//DTD GRAMMAR 1.0//EN"相匹配的內置DTD(來自目錄)進行文檔驗證。在SGML中,PUBLIC標識符之後可以跟隨一個系統標識符,該標識符應被視爲關於所使用的DTD的暗示。 在XML這已更改,以便公共標識符存在,其必須後跟一個系統標識符;但這並不會改變這些標識符的邏輯或目的。

公共標識符表示這個文檔遵循的規範,所以實際上它告訴整個文檔中使用的語法,所以它以一種與XML中的名稱空間相同的目的服務於當前。公共標識符的形式通常遵循共同的結構,因此包含語言代碼。該代碼僅暗示所引用的規範是用什麼(自然/人類)語言編寫的,並不意味着文檔本身將包含使用該語言。在您的情況下,DOCTYPE確實而不是意味着您的文檔應該使用,參考或是關於英語。

而不是PUBLIC DOCTYPE聲明還可以包含關鍵字SYSTEM這意味着DTD應作爲系統特定的方式檢索。 SYSTEM後面只有一個URL或文件路徑。

+1

要清楚的是,如果還有公共標識符,則系統標識符不是可選的。 (http://www.w3.org/TR/xml/#NT-ExternalID)系統標識符是可選的唯一方法是,如果沒有公共標識符,並且所有內容都在內部子集中聲明,如:<<! DOCTYPE語法[012]> –

+0

非常感謝,@ jasso和@DevNull。您的解釋和鏈接確實幫助我更好地瞭解這些類型案例中的DTD使用情況。 – nlper

+0

@DevNull呵呵,我被困在過去。在SGML中,如果存在公共標識符,系統標識符是可選的,並且我認爲這對XML沒有改變。感謝您指出這一點,我會解決我的答案。但是與你寫的不同的是,即使沒有內部的DTD子集,系統和公共標識符也可以省略,因爲[它也是可選的](http://www.w3.org/TR/xml/#NT-doctypedecl) HTML5 doctype'<!DOCTYPE html>'是XML和SGML中的有效doctype。 PS對不起,我沒有登錄到Stackover兩個月。 – jasso