5.2 属性値の候補
属性リスト宣言では、属性の値に関する以下の指定を行うことができます。
- 属性値の型を指定
属性値がどのようなデータ型をしているのか、指定します。 - 属性値のリストを指定
属性値の候補リストを記述します。
5.2.1 属性値の型
属性値の型には以下のものがあります。
型名 | 内容 | 使用できる文字 |
---|---|---|
CDATA | 文字データ | 任意の文字が使用できる |
ID | 識別子 | 名前(*)の形式の必要がある |
IDREF | 識別子参照値。 ID型の属性で指定された識別子への参照値 | 名前(*)の形式の必要がある |
IDREFS | 複数のIDREFの属性値 | 複数の「名前」をブランクで区切った形 |
NMTOKEN | 「名前トークン」というタイプの文字列 | 「名前」の2文字目以降に使用できる文字を先頭に書いてもよい。(数字などから始まってもよい) |
NMTOKENS | 複数の「名前トークン」 | 複数の「名前トークン」をブランクで区切って書く |
ENTITY | エンティティ参照値 | 名前(*)の形の必要がある |
ENTITIES | 複数のエンティティ参照値 | 複数の名前をブランクで区切る |
「名前」の形式とは、要素名や属性名の制限に従った形という意味です(詳細は、2章「要素と属性に使用できる文字 」)。それぞれのデータ型の詳細について、以下に記述します。CDATAは、任意の文字列を属性値として許可することを示します。引用符で囲まれた属性値の場所に、どんなテキストを記述してもよいことを示します。以下に例を示します。
<!ATTLIST 書籍名 読み方 CDATA #IMPLIED>
以上のように読み方属性を定義した場合、以下のように属性の値にどんな文字列を使用してもかまいません。
<書籍名 読み方="ツイテクル キョウトジュウサンヤモノガタリ">ついてくる京都十三夜物</書籍名>
ID型は、要素を一意に識別するための値を与えるために指定します。このID型の属性値をもつ要素への参照を示したい場合に、IDREF型の属性を定義します。以下に例を示します。
... <!ELEMENT 商品 #PCDATA> <!ATTLIST 商品 商品番号 ID #REQUIRED> <!ELEMENT 商品参照 EMPTY> <!ATTLIST 商品参照 商品参照 IDREF #REQUIRED> <商品 商品番号="a001">Let's Beer</商品> <商品 商品番号="b051">京都洛西 西山の朝ぼり竹の子篭入りセット</商品> <商品 商品番号="c083">TIMEX CLIP 70821</商品> <注意>なお、<商品参照 商品参照="b051"/>の返品はご遠慮ください</注意>
以上の例では、商品要素に商品番号という、ID型の属性を定義しています。商品番号の定義により、各商品の参照が可能になります。参照の例として注意要素を記述しました。以上のように記述した場合、XMLを処理するアプリケーション上で、以下のように表示させることが容易になります。
なお、「京都洛西 西山の朝ぼり竹の子篭入りセット」の返品はご遠慮ください
また、IDREFS型を指定すると、複数のID型への参照が可能になります。
... <!ATTLIST 商品参照 商品参照 IDREFS #REQUIRED> <商品 商品番号="a001">Let's Beer</商品> <商品 商品番号="b051">京都洛西 西山の朝ぼり竹の子篭入りセット</商品> <商品 商品番号="c083">TIMEX CLIP 70821</商品> ... <注意>なお、<商品参照 商品参照="a001 b051"/>の返品はご遠慮ください</注意>
IDREF型およびIDREFS型を指定した属性の値は、そのXML文書中に存在するID型の属性値でなければなりません。上の例ですと、a001およびb051がそのXML文書中の商品番号属性で定義されていない場合、エラーとなります。
また、ひとつのXML文書内のID型の属性値は一意である必要があります。以下のXML文書はエラーになります。
... <!ATTLIST 商品 商品番号 ID #REQUIRED> ... <商品 商品番号="a001">Let's Beer</商品> <商品 商品番号="a001">京都洛西 西山の朝ぼり竹の子篭入りセット</商品>
要素が違う場合でも、ID型属性値はXML文書内で一意になる必要があります。以下に例を示します。
... <!ATTLIST 食品 食品番号 ID #REQUIRED> <!ATTLIST 電化製品 電化製品番号 ID #REQUIRED> <食品 食品番号="a001">新潟栃尾市こしひかり</食品> <電化製品 電化製品番号="a001">ボーズ「ベビーキャノン AM-033」 ヤマギワ</電化製品>
上の例では、属性名も要素も異なる2つのID型属性を定義していますが、2つの属性値が一致しています。このような場合でも、XMLではエラーになります。
また、以下のように、同じ要素に複数のID型属性を定義することもできません。
<!ATTLIST 食品 食品番号 ID #REQUIRED 食品コード ID #REQUIRED>
属性リスト宣言ではデフォルトの属性値を指定できますが、ID型は属性値が一意でなければいけないことから、デフォルト値は#REQUIREDか#IMPLIEDでなくてはなりません。
NMTOKEN型を宣言した場合、名前開始文字ではない文字で属性値を開始することが可能になります。例えば、数字やハイフンなどから始まる属性値を記述することが可能です。
<!ATTLIST 画像 size NMTOKEN #IMPLIED>
以上のように画像要素のsize属性を宣言した場合、以下のように数字で始まる属性値を記述することが可能になります。
<画像 size="300pt"/>
NMTOKEN型の文字列を、スペースで区切りながら複数属性値に指定できるのがNMTOKENS型です。
<!ATTLIST 画像 size NMTOKENS #IMPLIED> ... <画像 size="300pt 400pt"/>
最後にENTITY型です。エンティティとは、XML文書内で使用する置換文字列やファイルなどを指します。たとえば、XML文書内で外部GIFファイルなどを参照するときは、エンティティを使用します。エンティティについての詳細は、次章で解説します。このENTITYを属性値としてとる場合にENTITY型を宣言します。さらに、ENTITYを複数参照したい場合にENTITIES型を宣言します。以下に例を示します。
<!ENTITY figA SYSTEM "http://www.utj.co.j/fileA.gif" notation="GIF"> <!ATTLIST 画像 file ENTITY #IMPLIED> ... <画像 file="figA"/>
上の例では、1行目でエンティティを、2行目でENTITY型の属性を宣言しています。最終行で、属性値をENTITY figAに設定しています。これにより、XMLプロセッサはfigAをENTITYで宣言しているGIFファイルに置き換えて解釈します。GIFファイルは画像データです。画像データのように、XMLのデータ形式で記述されていない外部ファイル(これを解析対象外実体という)を参照する場合は、必ずENTITY型の属性値により参照する必要があります。
5.2.2 属性値のリスト
属性値の指定の仕方には、データ型ではなく、具体的に属性値になりうる値のリストを記述する方法もあります。書式は以下のとおりです。
<!ATTLIST 要素名 属性名 (属性値候補1 | 属性値候補2 |...) デフォルト値>
以下に例を示します。
<!ATTLIST 信号 色 (赤|青|黄色) "青"> ... <信号 色="赤"/>
上の例ですと、信号要素の色属性の値は、赤、青、黄色のどれか一つでなければなりません。この属性値に緑と指定するとエラーになります。ところで、属性値を列挙する場合、データ型はNMTOKENである必要があります。そのため、例えば、スペースを含むような属性値は使用できません。