興味深い質問です。よく尋ねた!
どちらの方向でも、答えは「いいえ」です。
以下は、XSD に相当するものがない DTD です。
<!ELEMENT e (#PCDATA | e)* >
<!ENTITY egbdf "Every good boy deserves favor.">
この DTD が受け入れる一連の文字シーケンスには、<e/>
と<e>&egbdf;</e>
の両方が含まれますが、 は含まれません<e>&beadgcf;</e>
。
XSD 検証は、エンティティがすべて展開済みの情報セットで動作するため、3 番目のケースと 2 番目のケースを区別できる XSD スキーマはありません。
DTD が XSD では表現できない制約を表現できる 2 つ目の領域には、NOTATION 型が含まれます。例は挙げません。詳細は複雑すぎて、調べないと正確に覚えられませんし、調べたくなるほど面白くもありません。
3 番目の領域: DTD は名前空間属性 (別名名前空間宣言) と一般属性を同じ方法で扱います。したがって、DTD はドキュメント内の名前空間宣言の外観を制限できます。XSD スキーマではできません。同じことが xsi 名前空間の属性にも当てはまります。
これらの問題をすべて無視し、事前定義された実体以外の名前付き実体への参照を含まない文字シーケンスのみに関して質問を定式化するとlt
、gt
答えが変わります: NOTATION 宣言を含まないすべての DTD について、は、エンティティ展開後に正確に同じドキュメント セットを受け入れ、名前空間属性と xsi 名前空間の属性を無視する方法で「同じ」が定義された XSD スキーマです。
反対に、相違点には次のようなものがあります。
XSD は名前空間に対応しています。次の XSD スキーマはe
、ドキュメント インスタンス内のその名前空間にバインドされているプレフィックスに関係なく、指定されたターゲット名前空間内の要素のインスタンスを受け入れます。
<xs:schema xmlns:xs="..." targetNamespace="http://example.com/nss/24397">
<xs:element name="e" type="xs:string"/>
</xs:schema>
e
指定された名前空間内のすべての要素のみを正常に受け入れることができる DTD はありません。
XSD にはより豊富なデータ型のセットがあり、データ型を使用して要素と属性を制約できます。次の XSD スキーマには、同等の DTD がありません。
<xs:schema xmlns:xs="...">
<xs:element name="e" type="xs:integer"/>
</xs:schema>
このスキーマはドキュメントを受け入れますが、ドキュメントは受け入れ<e>42</e>
ません<e>42d Street</e>
。DTD には #PCDATA コンテンツを制約するメカニズムがないため、どの DTD もそれを区別できません。最も近い DTD は<!ELEMENT e (#PCDATA)>
、両方のサンプル ドキュメントを受け入れる です。
XSD のxsi:type
属性により、ドキュメント内でコンテンツ モデルを変更できます。次のスキーマ ドキュメントで説明されている XSD スキーマには、同等の DTD がありません。
<xs:schema xmlns:xs="...">
<xs:complexType name="e">
<xs:sequence>
<xs:element ref="e" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="e2">
<xs:sequence>
<xs:element ref="e" minOccurs="2" maxOccurs="2"/>
</xs:sequence>
</xs:complexType>
<xs:element name="e" type="e"/>
</xs:schema>
このスキーマはドキュメントを受け入れ、ドキュメント<e xmlns:xsi="..." xsi:type="e2"><e/><e/></e>
を拒否します<e xmlns:xsi="..." xsi:type="e2"><e/><e/><e/></e>
。DTD には、ドキュメント インスタンスで指定された属性値に依存するコンテンツ モデルを作成するメカニズムがありません。
XSD ワイルドカードを使用すると、指定された要素の子に任意の適切な形式の XML を含めることができます。DTD でこれに最も近いのは、フォームの要素宣言を使用する<!ELEMENT e ANY>
ことです。これは、実際に現れるすべての要素の宣言を必要とするため、同じではありません。
XSD 1.1 は、アサーションと条件付き型割り当てを提供しますが、DTD には類似のものはありません。
XSD の表現力が DTD の表現力を超える方法は他にもあると思いますが、その点は十分に示されていると思います。
XSD は、名前空間宣言や xsi:* 属性などのエンティティ宣言と特殊なケースを除いて、DTD が表現できるすべてを表現できます。XSD はそうできるように設計されているためです。そのため、DTD を XSD スキーマ ドキュメントに変換する際の情報の損失は、比較的控えめで、よく理解されており、ほとんどのボキャブラリ デザイナーが DTD アーティファクトと見なして実質的に関心のないものに関係しています。
XSD はそのように設計されているため、XSD は DTD よりも多くの表現を行うことができます。一般に、XSD から DTD への変換には必然的に情報の損失が伴います (受け入れられるドキュメントのセットを大きくしたり、小さくしたり、重複したセットにしたりする必要がある場合があります)。情報の損失を管理する方法については、さまざまな選択が可能であり、「XSD を DTD 形式に変換するにはどうすればよいか」という疑問が生じます。特定の理論的関心。(ただし、実際にこれを興味深い質問だと考える人はほとんどいないようです。)
これはすべて、あなたの質問と同様に、文字シーケンスとしてのドキュメント、ドキュメント セットとしての言語、およびその意味での言語のジェネレータとしてのスキーマ言語に焦点を当てています。ドキュメント セットの拡張の違いにならないスキーマに存在する保守性と情報の問題 (たとえば、ドキュメント モデル内のクラス階層の扱い) は考慮されていません。