2

DTD 属性定義の列挙値のリストを指定する場合、複数単語の値を使用できますか?

      <!ATTLIST SystemName Case ("MIXED RESPECT"|"MIXED IGNORE"|"LOWER RESPECT"|"LOWER IGNORE"|"UPPER RESPECT"|"UPPER IGNORE") "MIXED IGNORE">

値を (示されているように) 引用符ではなく引用符で囲んでみました。私は表記法とnmtokensについて読み続けていますが、私が見ているすべての場所は「何とか仕様を参照してください」と言っているようですが、例はありません。例は約 100 万ページの仕様に相当します。

4

1 に答える 1

4

いいえ、列挙値にスペースを含めることはできません。列挙された各値は、正当な NMTOKEN でなければなりません。つまり、XML 名で使用できる一連の文字でなければなりません。したがって、MIXED、Mixed、RESPECT、MIXED-RESPECT、および MIXED_RESPECT は、列挙では正当な値ですが、「MIXED RESPECT」ではありません。ごめん。

その理由は歴史的なものです。SGML (XML の派生元) では、可能な値の列挙リストで宣言されている場合、言語のオプション機能により、属性名を省略できました。だから代わりに

<SystemName Case="MIXED_RESPECT">...

著者は書くことができる

<SystemName MIXED_RESPECT>...

<table border="noborder">orの代わりに、<table border="border">著者は単に<table border>orと書くことができ<table noborder>ます。値がコンテキストで解析可能であることを確認するために、それらは正当な NMTOKEN であることが制約されました。

この機能の欠点の 1 つは、この魔法のトリックが常に可能であることを保証するために、SGML では 2 つの属性の列挙値が重複することを禁じていたため、2 つの属性を正当な値としてyesおよびnoとして持つことができなかったことです (パーサーが見て<table yes>も意味がわからないかもしれませんborder="yes"compact="yes"

最小化機能は XML では削除されました (SGML パーサーを作成することを冒険的にした他のすべての最小化機能と同様に) が、すべての XML DTD が SGML として合法であることを保証するために、それを可能にした制約は保持されました。 DTD。

于 2012-09-20T23:45:41.783 に答える