グループ化


要素のグループ化

実は、要素型宣言における記述内容の ( ) は一つのグループを表しています
このグループは、他のグループをネストすることが可能であり
これを用いることによって、非常に強力な構造を宣言することができます

例えば、前回の例のように document 要素が title または name 要素を1つ含み
その後に、本文となる text 要素をもつことができる文書型宣言をするとしましょう
ただし、表題となる title または name 要素は省略可能とします

こう考えた場合、title 及び name 子要素はグループと考えることができます
title または name は選択リストですが、これらは省略可能であるという共通点を持ちます
つまり、title | name をグループと捉え、このグループに疑問符 ? がかかります
グループに対して、*、+、? 記号などを宣言することが可能なのです
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (document+)>
	<!ELEMENT document ((title | name)? , text)>
	<!ELEMENT title (#PCDATA)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT text (#PCDATA)>
]>

<object>
	<document>
		<title>Kitty on your lap</title>
		<text>This is Cat girl story.</text>
	</document>
	<document>
		<text>Tokyo mew mew is Cat girl story.</text>
	</document>
</object>
(title | name)? という DTD の宣言は
title | name というグループを 0 個、または 1 個指定できることを表しています
そして、このグループの次には、必ず text 個要素を指定しなければなりません

どうでしょうか、先ほどの条件を満たしています
title または name のいずれかを指定でき、そして、これらは省略可能です
その後には、必ず本文となる text 要素を指定しなければならないのです

((title | name)? , text) という形に、括弧のグループをネストすることで
非常に柔軟な、そして強力な文書型宣言を実現できます

HTML のような、文書の作者がどのタグをどの位置で用いるかを
文書によってランダムに配置するような場合、このグループ化を利用しなければなりません
DTD の要素型宣言で、カンマによって単純に使用する子要素を列挙しただけでは
文書の作者は、DTD の作者の宣言順番で子要素を配置させなければなりません
これは、画像ファイルを作者が自由な位置に貼り付けたい場合などは障害となるでしょう

要素 A と要素 B が交互に好きな数だけ指定できる場合や
複数の子要素を、好きな順番で、適当な数だけ指定できるという仕様の場合も
グループ化を用いれば実現できます
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (document)>
	<!ELEMENT document (title , text)*>
	<!ELEMENT title (#PCDATA)>
	<!ELEMENT text (#PCDATA)>
]>

<object>
	<document>
		<title>Kitty on your lap</title>
		<text>This is Cat girl story.</text>
		<title>Magical nyan nyan TARUTO</title>
		<text>TARUTO is a princess in byou kind.</text>
	</document>
</object>
(title , text)* というグループは、title と text 子要素が
この組み合わせのこの順番で、適当な数を指定できることを表しています
適当な数を指定するだけなら * でできましたが、この順番の組み合わせでという部分は
グループ化を用いなければできなかった芸当です

次のようにすれば、ランダムにグループの要素を指定することができるようになります
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE object [
	<!ELEMENT object (document)>
	<!ELEMENT document (text | img | label)*>
	<!ELEMENT label (#PCDATA)>
	<!ELEMENT img (#PCDATA)>
	<!ELEMENT text (#PCDATA)>
]>

<object>
	<document>
		<img>http://***</img>
		<label>Kitty on your lap</label>
		<img>http://***</img>
		<text>Magical nyan nyan TARUTO</text>
		<label>Tokyo mew mew</label>
	</document>
</object>
この文書の document 要素は、子要素として適当な位置に適当な数の
text、img、label 要素を指定することができます



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