「有効なSGMLDTD」は技術的に少しあいまいであることに注意してください。これは、使用される「SGML宣言」によって異なります。これは、名前の最大長や、名前に含まれる可能性のある文字などを指定する場所です。これは、特定のDTD(したがって特定のSGMLドキュメント)で使用される「具体的な構文」です。
SGMLの「デフォルト」構文は「参照具体構文」と呼ばれ、ISO 8879:1986で定義されています。この構文では、名前の最大長(いわゆる「NAMELEN数量」)が8(8)に設定されており、名前にLOW LINE()_
を使用できないためです(いわゆる名前文字ではありません)。 )、DTDは、参照の具体的な構文に関しては有効ではありません。
たとえば、HTMLは独自のSGML宣言を使用します。これにより、 NAMELENの数が大幅に増加_
し、名前の文字が追加されます。この具体的な構文に関しては、DTDは実際に構文的に有効です。
ただし、の要素宣言はありませんchannel_name
が、DTDでは少なくとも1つのそのような要素が存在する必要がありますtvguide
(つまり、必須要素に含まれているchannel
)。[ドキュメントで発生しない要素タイプの宣言を除外すること自体は、エラーや問題ではありません。]
したがって、DTDは、それに従って有効なドキュメント要素(つまり、tvguide
要素、または単に「ドキュメント」)を記述できないという意味で、(まだ)「有効」ではありません。
channel_name
likeの簡単な宣言を追加する
<!ELEMENT channel_name (#PCDATA)>
これを改善します—たとえばドキュメント要素
<tvguide>
<date>2016</date>
<channel><channel_name>XTV</channel_name></channel>
</tvguide>
DTDに応じて有効です。(他の回答で述べたSPパーサーを使用して試してみました。)
DTDの名前を単純化すると、すべてが有効な「基本SGMLドキュメント」になり、有効な「最小SGMLドキュメント」にさえなります。これらの用語(これもISO 8879から)は、具体的でない場合は「有効なSGML」の概念に最も近くなります。コンテキストとSGML宣言が与えられます:それらは基本的に「ポータブルであらゆるSGMLシステムに受け入れられる」ことを意味します。これが私の提案したバージョンです:
<!DOCTYPE tvguide [
<!ELEMENT tvguide - - (date,channel+)>
<!ELEMENT date - - (#PCDATA)>
<!ELEMENT channel - - (ch-name,format?,program*)>
<!ATTLIST channel
teletext (yes|no) no>
<!ELEMENT format - - (#PCDATA)>
<!ELEMENT ch-name - - (#PCDATA)>
<!ELEMENT program - - (name,start-tm,(end-tm|duration))>
<!ATTLIST program
min-age CDATA #REQUIRED
lang CDATA "es">
<!ELEMENT name - - (#PCDATA)>
<!ELEMENT start-tm - - (#PCDATA)>
<!ELEMENT end-tm - - (#PCDATA)>
<!ELEMENT duration - - (#PCDATA)>
]>
<tvguide>
<date>2016-12-11</date>
<channel><ch-name>X-TV 4</ch-name></channel>
</tvguide>