3

私は次のSGMLDTDを作成しました。

<!DOCTYPE tvguide[
    <!ELEMENT tvguide--(date,channel+)>
    <!ELEMENT date--(#PCDATA)>
    <!ELEMENT channel--(channel_name,format?,program*)>
    <!ELEMENT channel--(#PCDATA)>
    <!ATTLIST channel teletext (yes|no) "no">
    <!ELEMENT format--(#PCDATA)>
    <!ELEMENT program--(name,start_time,(end_time|duration))>
    <!ATTLIST program
        min_age CDATA #REQUIRED
        lang CDATA #IMPLIED es>
    <!ELEMENT name--(#PCDATA)>
    <!ELEMENT start_time--(#PCDATA)>
    <!ELEMENT end_time--(#PCDATA)>
    <!ELEMENT duration--(#PCDATA)>]>

構文エラーがあるかどうか、どこにあるか、そしてそれが有効なSGML DTDであるかどうかを確認するには、どのツールを使用する必要がありますか?

このDTDを使用してファイルを検証するには、どのツールを使用する必要がありますか?私はWindows用のプログラムを好みますが、Linuxバイナリ、またはPHP、C、C ++、Java、またはJavascriptで記述されたライブラリでも問題ありません。

4

2 に答える 2

4

JamesClarkのSPを見てください。OmniMarkを使用してSGMLを検証していますが、コピーを見つけることができなくなったと思います。

タグの最小化に関するエラーが発生するはずです(の前/後/間にスペースが必要です--)。また、要素が2回宣言されていることに関するエラーと、の属性宣言channelの「es」に関するエラーが発生するはずです。langprogram

参照用の有効なバージョンは次のとおりです。

 <!DOCTYPE tvguide [
 <!ELEMENT tvguide - - (date,channel+)>
 <!ELEMENT date - - (#PCDATA)>
 <!ELEMENT channel - - (channel_name,format?,program*)>
 <!ATTLIST channel teletext (yes|no) "no">
 <!ELEMENT format - - (#PCDATA)>
 <!ELEMENT program - - (name,start_time,(end_time|duration))>
 <!ATTLIST program
      min_age CDATA #REQUIRED
      lang CDATA "es">
 <!ELEMENT name - - (#PCDATA)>
 <!ELEMENT start_time - - (#PCDATA)>
 <!ELEMENT end_time - - (#PCDATA)>
 <!ELEMENT duration - - (#PCDATA)>
 ]>
于 2012-12-11T15:28:38.203 に答える
3

「有効な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_namelikeの簡単な宣言を追加する

<!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>
于 2016-12-11T04:18:05.517 に答える