属性リスト宣言
XML文書内で使用される属性の候補値やデータ型・デフォルト値・属性名、属性を持つ要素名などを以下のように定義する。 (公式の対応部分は https://www.w3.org/TR/2006/REC-xml11-20060816/#attdecls )
<!ATTLIST 要素名 属性名 属性のデータ型 "デフォルト値">
属性リスト宣言を書く以上、要素名・属性名・属性のデータ型・デフォルト値いずれも必須
※1つの要素に対して複数の属性の宣言を書く場合、以下のようにする。
<!ATTLIST 要素名 属性名X 属性のデータ型a "デフォルト値"
属性名y 属性のデータ型b "デフォルト値"
属性名z 属性のデータ型c "デフォルト値">
同じ要素に対して、同じ属性名の属性リスト宣言が別々で指定されていた場合
⇒最初に定義された宣言が有効となる
<!ATTLIST root attr CDATA #REQUIRED> 👈こちらが有効
<!ATTLIST root attr (red | blue) "blue">
<!ELEMENT root (#PCDATA)>
要素名
属性を持たせる要素の名前を指定する。
※ここで指定した要素については、別途、要素型宣言で定義しておく。
属性名
属性の名前を指定する。
※属性名は大文字小文字を区別する
候補値
属性値の候補が複数ある場合は、その値(文字列)を縦棒「 | 」で区切って列挙する。
※候補値はシングルクヴォーテーション( ' )やダブルクヴォーテーション( " )で囲む必要はない
属性のデータ型
XML文書では記述する属性値のデータ型を以下の決められたキーワードで指定
| データ型 | 意味 |
|---|---|
| CDATA | XMLで使用できるものなら基本的に自由な文字列でOK |
| ID | 一意識別子(各要素につける一意な識別番号) ※HTMLの id属性にかなり近く、これを指定された属性を持つ要素はXML間で統一される必要がある |
| IDREF | 一意識別子への参照 ※👆のIDを指定された各属性に対して外部キーのように参照する (⇒この属性に設定する値は、必ずID型を指定した属性に 設定されていないといけない) |
| IDREFS | 複数の一意識別子への参照 ※IDREFの複数版 |
| NMTOKEN | NAMETOKENの略。指定することで、 属性値として1つの名前トークンをとれる |
| NMTOKENS | NAMETOKENSの略。指定することで、 属性値として 複数の名前トークン(空白区切り) をとれる |
| ENTITY |
外部解析対象外実体(テキストであってもXML構文に従わないもの、またはテキスト以外のデータ(画像など))を1つだけ属性値として参照するために使う (⇒対応する実体宣言を事前にDTDに書いてから使う) |
| ENTITIES | 複数の外部解析対象外実体を空白区切りで属性値として参照するために使う (⇒対応する実体宣言を事前にDTDに書いてから使う) |
| 列挙 | ユーザーが指定した属性値のリスト |
DTDでは属性値の長さや桁数は指定できない
※W3CのXML Schema 1.0/1.1では、属性のデータ型に対して長さや桁数を指定できる
指定することで本来XMLでは2文字目以降にしか指定できない文字を開始文字とした文字列を属性値に記述できるようになるデータ型には、NMTOKEN、NMTOKENSの他にCDATAがある
デフォルト値
実際のXML文書で属性が記述されなかった場合に使用する値(デフォルト値)に関する設定を以下のいずれかで指定する。
| 指定できる値 | 意味 |
|---|---|
| ユーザー定義のデフォルトの属性値データ | 属性が省略されたときに設定される値 |
| #REQUIRED | 指定された要素に対して、XML文書内でその属性が使用されることを必須とする |
| #IMPLIED | 指定された要素が、属性を持たない(=属性を省略される)ことを許容する |
| #FIXED "固定値" |
指定された要素がとりうる属性値を固定値に限定する。 ※属性値が省略された場合、固定値が入る |
NMTOKENとNMTOKENSの違いを示す具体例
(A)NAMETOKEN型
<!ATTLIST item code NMTOKEN #REQUIRED>
<item code="abc-123"/> <!--「abc-123」で1つのトークン-->
(B)NAMETOKENS型
<!ATTLIST item tags NMTOKENS #REQUIRED>
<item tags="red large sale"/> <!--「red」「large」「sale」の3つのトークンが空白区切りで入っている-->
(XMLにおける)名前トークン
DTDやスキーマにおいて、空白を含まず、名前の2文字目以降に使用可能な文字(文字、数字、ピリオド、ハイフン、アンダースコア、コロン)で構成される属性値の型
名前(NAME)は英字やアンダースコアで始まる必要があるが、NMTOKENは数字やピリオドで始めることができる。
(XMLにおける)トークン
XMLファイルをパース(解析)する際、パーサーがXML文書を意味のある最小単位に分解したもの。また、XML Schemaではデータ型の一つとしても定義されている。
構文解析におけるトークン:<tag>、</tag>、テキストノード、属性など
主な参考資料
※下記のリンクは「DTDで属性リスト宣言を定義する」の見出し部分にとぶ