0

XMLのDTDを定義するときに、要素のサブパーツを指定することに関するクエリがあります。「Description」というタイトルの要素が必要です。この要素には、BookRefとPCDATAのインターリーブされたシーケンスが含まれている可能性があります。XMLDTDで次のステートメントを使用しています。

<!ELEMENT Description (#PCDATA|Courseref)* >

ただし、*よりも厳密な制約を適用したいと思います。+を使用したいのですが、少なくとも1つのPCDATAまたはCourserefが必要です。ただし、*の代わりに+を使用すると、xmllintを使用して解析エラーが発生します。

私はDTDを初めて使用しますが、XML DTD仕様に従って+演算子を指定することが違法であるかどうかを知りたいのですが、

4

2 に答える 2

0

はい、XML 仕様では、フォームのコンテンツ モデルが必要です。

(#PCDATA | foo | bar | baz)*

#PCDATA最初にリストし、発生インジケータとして *not (またはその他) を使用します (http://www.w3.org/TR/xml/#NT-Mixed)。+

これには多くの設計上の考慮事項が含まれており、そのほとんどは現在、純粋に歴史的に重要なものになっています。ただし、注目に値する場合+があります。許可されていて、あなたが書いた場合

<!ELEMENT Description (#PCDATA|Courseref)+ >

要素宣言は、フォーム using と正確に同じ有効な要素インスタンスのセットを定義します*。トークン#PCDATAは、解析された文字データの 0 個以上の文字に一致するため、要素インスタンス like<Description/>は、要素宣言のいずれの形式に対しても有効です (長さがゼロのstring は content-model トークンに 1 回一致するため、 - マークの付いた選択肢が少なくとも 1 回満たされる#PCDATAという要件が満たされます)。+

説明を含めることで、ここで意図を伝えることができます

(p+ | Courseref)

p空の(段落)要素は眉をひそめているとドキュメントで言っています。しかし、DTD は、文字列に最小長のコンテンツがあることを要求する方法を提供しません#PCDATA。これが、XSD、Schematron、Relax NG の使用を好む人がいる理由の 1 つです。

于 2012-08-21T19:09:50.017 に答える
0

混合コンテンツ モデル(#PCDATA と要素 ( Courseref) の両方) があるため、オカレンス インジケーターを使用する必要があります*

モデルに #PCDATA がない場合は、 を使用できます+

仕様の混合コンテンツ モデル セクションからの重要な情報:

...子要素の型は制約される場合がありますが、順序や出現回数は制約されません

于 2012-08-08T15:23:51.147 に答える