属性宣言


DTD における属性の指定

これまでは、DTD で文書の要素に関連した定義を説明しましたが
この他に、文書には「属性」が存在します
今度は、DTD で XML の属性に関連した宣言文を紹介します

DTD で属性を宣言するには <!ATTLIST> タグを用います
ATTLIST に続き、属性を持つ要素名、属性名、属性型、デフォルト値を宣言します
XML 文書での属性は、必ず要素の開始タグで指定されるため
まず、属性を宣言するためには、その要素を指定しなければなりません

<!ATTLIST 要素名 属性名 属性型 デフォルト値>

属性型とは、この属性で指定する値の型を指定します
属性型については、今後、一つずつ詳しく説明していきますが
例えば、単純な文字データを属性で指定するのならばならば CDATA を指定します

属性は、要素とは異なり、文書のためではなく、文書を展開するプログラムのためにあります
その要素に関連した情報をプログラムに動的に知らせる手段こそが「属性」なのです

属性型で、もっとも一般的なものは、文字データである CDATA です
この型を持つ属性には、任意のテキスト文字を指定することができます
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (document)>
	<!ELEMENT document (#PCDATA)>
	<!ATTLIST object copyright CDATA "NULL">
]>

<object copyright="Leon Akasaka">
	<document>
		Kitty on your lap
	</document>
</object>
この文書の object 要素は、この文書の作者を表す copyright 属性を持ちます
DTD を見れば、ATTLIST によって object に copyright 属性が CDATA 型で宣言されています
この属性は省略可能で、省略した場合は NULL という文字列が入ります

属性名が衝突しなければ、一つの要素が複数の属性を持つことはかまいません
実際、要素が複数の属性を持つことは一般的なことです

例えば、オブジェクトが、描画する長方形の範囲を指定する場合などは
rect="100 , 100" とするよりも、width="100" height="100" と分けたほうが
プログラムから見ると、それぞれの値にアクセスしやすく、分割する手間が省けます
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (document)>
	<!ELEMENT document (#PCDATA | img)*>
	<!ELEMENT img EMPTY>
	<!ATTLIST img width CDATA "-1">
	<!ATTLIST img height CDATA "-1">
]>

<object>
	<document>
		<img width="400px" height="600px" />
	</document>
</object>
この文書の img タグは width と height 属性を指定しています
DTD を見ればわかるように、この要素は二つの属性が宣言されています

ただし、複数の属性を宣言する場合は、次の構文も使えます
<!ATTLIST 要素名 
	属性名1 属性型1 デフォルト値1
	属性名2 属性型2 デフォルト値2...
>
この方が、属性を宣言する時に、重複して要素を指定する必要がありません
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (document)>
	<!ELEMENT document (#PCDATA | img)*>
	<!ELEMENT img EMPTY>
	<!ATTLIST img 	width CDATA "-1"
			height CDATA "-1"
	>
]>

<object>
	<document>
		<img width="400px" height="600px" />
	</document>
</object>
これは、上の文書と意味はまったく同じものですが
DTD の img 要素の属性宣言の方法が異なっています
この方法のほうが、多くの属性を持つ要素に対してはスリムで便利です


デフォルト値の設定

全ての属性にデフォルト値があるとは限らないでしょう
必ず、文書の作者が指定しなければならない属性もあるでしょうし
省略可能ではあるが、デフォルトとなる適当な値がない場合もあります

デフォルト値を使わず、属性の指定を強制したいのであれば
DTD の属性のデフォルト値を指定する部分に #REQUIRED を指定します
これが指定された属性は、省略することはできません
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (#PCDATA)>
	<!ATTLIST object copyright CDATA #REQUIRED>
]>

<object copyright="Leon Akasaka">
	Kitty on your lap
</object>
object 要素の copyright 属性は、必須属性です
デフォルト値が指定されている場合、プログラムが属性にアクセスする時
XML パーサは、プログラムに対して定義されているデフォルト値を渡しますが
この場合、XML パーサは、属性が省略されると妥当な文書ではないと判断します

デフォルト値を指定しないが、省略可能な属性を宣言する場合は
#REQUIRED ではなく #IMPLIED キーワードを用います
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (#PCDATA)>
	<!ATTLIST object copyright CDATA #IMPLIED>
]>

<object>
	Kitty on your lap
</object>
copyright は、デフォルト値はありませんが、省略可能となっているため
この文書は妥当な整形式 XML であると考えることができます

XML パーサは、属性が省略されている場合
アプリケーションに属性を利用できないことを通知します
これをどのように処理するかは、アプリケーションを開発する人の問題でしょう

さらに、DTD で属性の固定値を指定することも可能です
これは、完全に定数と扱われるため、変更不能なデフォルト値です
属性を省略しても、パーサは自動的にその固定値と属性をタグに挿入します
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (#PCDATA)>
	<!ATTLIST object copyright CDATA #FIXED "Leon Akasaka">
]>

<object>
	Kitty on your lap
</object>
サンプルを見る

サンプルを見れば、object タグが copyright 要素をデフォルトで持ち
それに "Leon Akasaka" という固定デフォルト値が挿入されていることがわかるでしょう
省略せずに、属性を指定することができますが、固定値以外を指定することはできません



前のページへ戻る次のページへ