1


私はXMLに不慣れで、現在文書型宣言について学んでいます。とにかく、DTDの本体で要素を宣言する場合、要素名は、名前空間プレフィックスを含め、XMLドキュメント内で正確に表示される必要があります。つまり、ユーザーは独自の名前空間を定義できませんが、DTD内で定義されたプレフィックスを使用する必要があります。

a)DTD内で定義されたプレフィックスを使用する必要がある場合でも、これらのプレフィックスが指すURIを選択できると思いますか?


b)(DTDで)要素を宣言すると仮定すると、persは名前空間プレフィックスですが、XMLドキュメント内のこの要素のすべてのオカレンスにプレフィックス「pers」を含める必要があることを意味しますか?その場合、DTDではデフォルトの名前空間機能を使用できないことを意味しますか?!


ありがとう


編集:


a)

実際、特に正当な理由がある場合、または単純な構文要件があり、名前空間が必要ない場合を除いて、代わりにXMLスキーマの使用を検討する必要があります。

代わりにXMLスキーマを使用する予定ですが、DTDの基本についても学びたいと思います。


b)

…名前空間URI(デフォルトの名前空間)の概念はありません。

DTD内で「xmlns」という名前の属性を宣言する場合:

<!ATTLIST contact xmlns CDATA #REQUIRED> 


その場合、XMLドキュメントはデフォルトの名前空間機能を使用できます(ここでは、子要素<name>はデフォルトの名前空間にあります)。

       ...
<contact xmlns=”www.somewhere.com” … > 
   <name></name>
</contact>       
       ...


ありがとう

4

2 に答える 2

4

DTD には名前空間の概念がまったくありません。名前空間の概念は、それらの概念の後に導入されました。

XML 名前空間の場合、重要な部分は名前空間 URI であり、プレフィックスではありません。プレフィックスはユーザーが自由に変更できます。

一方、DTD で名前空間の「接頭辞」を指定すると、接頭辞の部分は単純に要素名の一部と見なされます (DTD には名前空間の概念がないため)。したがって、「プレフィックス」を変更することはできず、名前空間 URI (デフォルトの名前空間も) の概念はありません。

本当に、特に正当な理由がない限り、または単純な構文要件があり、名前空間が不要な場合を除き、代わりに XML スキーマの使用を検討する必要があります。

完全なスキーマ仕様は困難な場合がありますが、それほど複雑ではない特定の適切なサブセットを学習できることがわかりました。W3Schoolsの担当者は、基本についての優れた入門書を用意しています。

于 2010-01-19T19:57:25.743 に答える
3

要素名は、名前空間プレフィックスを含め、XML ドキュメント内で正確に表示される必要があります。つまり、ユーザーは独自の名前空間を定義できませんが、DTD 内で定義されたプレフィックスを使用する必要があります。

それは正しいです。DTD 全体でパラメーター エンティティを広範囲に使用することで、複合 Doctype の各部分で使用されるプレフィックスを任意に構成できるようにすることができます

<!ENTITY % mydoc.prefix "mydoc:">
...
<!ENTITY % mydoc.element.qname "%mydoc.prefix;element">
<!ENTITY % mydoc.foo.qname "%mydoc.prefix;foo">
<!ENTITY % mydoc.bar.qname "%mydoc.prefix;bar">
<!ELEMENT %mydoc.element.qname; (%mydoc.foo.qname; | %mydoc.bar.qname;)>

これがどのように機能するかの例については、XHTML モジュール化に関する作業と「DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1」doctype を参照してください。(答えは「あまりよくない」です。)

これは、XML ドキュメント内でこの要素が出現するすべての箇所に、接頭辞「pers」を含める必要があるということですか?

はい、DTD を揺らして同じ要素を別の接頭辞で (または接頭辞なしで) もう一度定義する場合を除きます。これを行うことはできますが (さらに、1 つの接頭辞を持つ要素が他の接頭辞を持つ要素を含むコンテンツ モデルを持つことを可能にすることもできます)、複数レベルのパラメーター エンティティを使用して記述するのは非常に苦痛であり、DTD は最終的に読めない。

Cumbayah のアドバイスに +1: 問題に選択肢がある場合 (特に名前空間に関係することをしている場合) は、きしむような古い DTD を使用しないでください。代替手段 (W3 Schema、RELAX NG、Schematron...) のいずれも、今日のタスクにより適しています。

于 2010-01-19T20:20:17.153 に答える