リスト(list)データ派生型

2002年8月11日(日)更新


■リスト(list)型

たけち: 今日は単純型の最後、リスト(list)型について学ぼうね。リストというのは何回も説明したけれども、制限(restriction)、ユニオン(union)、リスト(list)という単純型の3つの派生の方法の一つなんだ。

ユーザ派生データ型の作り方


■長歌と反歌

さらら: 難しいのかしら?

たけち: そんなことは、ないよ。例えばこういう例を考えてみるね。万葉集には長歌がたくさんあるよね。

さらら: そうね。私の知っている柿本人麻呂の歌には長歌がたくさんあるわね。

たけち: 長歌に対しては、複数の反歌が対応していることが少なくないよね。

さらら: えぇ。

たけち: たとえば、18巻の4089番の長歌をみてみよう。

さらら

高御座 天の日継と すめろきの 神の命の 聞こしをす 国のまほらに 山をしも さはに多みと 百鳥の 来居て鳴く声 春されば 聞きのかなしも いづれをか 別きて偲はむ 卯の花の 咲く月立てば めづらしく 鳴く霍公鳥 あやめぐさ 玉貫くまでに 昼暮らし 夜わたし聞けど 聞くごとに 心つごきて うち嘆き あはれの鳥と 言はぬ時なし

さらら: あら、大伴家持の歌ね。

たけち: この歌にはつぎの反歌があるんだね。

4090番 ゆくへなくありわたるとも霍公鳥鳴きし渡らばかくや偲はむ
4091番 卯の花のともにし鳴けば霍公鳥いやめづらしも名告り鳴くなへ
4092番 霍公鳥いとねたけくは橘の花散る時に来鳴き響むる

さらら: みっつもあるのね。

たけち: そこで、この長歌に関してはこういう反歌がありますよ、という情報を長歌の構造に含めたい場合は、たとえば次のように書いたりする方法が考えられるよね。

<yomi pno="4089" hanka="4090 4091 4092">
高御座 天の日継と すめろきの 神の命の 聞こしをす 国のまほらに 山をしも さはに多みと 百鳥の 来居て鳴く声 春されば 聞きのかなしも いづれをか 別きて偲はむ 卯の花の 咲く月立てば めづらしく 鳴く霍公鳥 あやめぐさ 玉貫くまでに 昼暮らし 夜わたし聞けど 聞くごとに 心つごきて うち嘆き あはれの鳥と 言はぬ時なし
</yomi>


■複数の反歌を持つことを示す属性

さらら: そうね。そういう感じになるかしら。

たけち: このhankaという属性がとる単純型の構造を考えると、正の整数(xsd:positiveInteger)が繰り返されているよね。

さらら: えぇ、そうね。でも、スキーマとしてはどう書くのかしら。

たけち: まずは以下を見てみようね。以前、属性の宣言のところで見てもらった例題を、ちょっと改良しただけなんだけど。

たけち

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="yomi" type="YomiType" />

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="pno" type="xsd:positiveInteger" use="required" />
<xsd:attribute name="hanka" type="PositiveIntegerListType" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:simpleType name="PositiveIntegerListType">
<xsd:list itemType="xsd:positiveInteger">
</xsd:simpleType>


</xsd:schema>

さらら: う〜ん、わからない書き方がいっぱい。この
<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
あたりなんて、全然わからないわ。

さらら

たけち: それについては複合型のところで説明するからね (^ ^; 今はそこを見るのはやめて・・・・・
<xsd:attribute name="hanka" type="PositiveIntegerListType" />
 という1行と、
<xsd:simpleType name="PositiveIntegerListType">
<xsd:list itemType="xsd:positiveInteger">
</xsd:simpleType>

 と書かれた部分に注目しようね。

さらら: えぇ。


■xsd:list

たけち: まず、
<xsd:attribute name="hanka" type="PositiveIntegerListType" />
というのは、PositiveIntegerListType型をとるhankaという属性を宣言しているんだ。

さらら: うんうん。

たけち: それじゃあ、そのPositiveIntegerListType型という単純型がどういう定義になっているか、というのが、
<xsd:simpleType name="PositiveIntegerListType">
<xsd:list itemType="xsd:positiveInteger">
</xsd:simpleType>

 なんだね。

さらら: そうなの。。。。

たけち: ここではxsd:listという要素のitemTypeに繰り返したい基準型であるxsd:positiveIntegerを書いているね。これによって、正の整数(xsd:positiveInteger)の繰り返しを表現できるんだよ。

さらら: なるほど、わかったわ。

たけち: これをまとめるとつぎのようになってるんだね。

さらら

リスト型の書き方

さらら: やっとわかったわ。

たけち: ところで、このリストによる派生の関係は実はDTDにもあるんだよ。

さらら: えっ、そうなの?

たけち: DTDにある

  • NMTOKEN → NMTOKENS
  • IDREF → IDREFS
  • ENTITY → ENTITITIES
というのは、すべて左の型を基準型にしたリスト型への派生の例なんだよ。これらはすべてDTDでもXMLスキーマでも最初から用意されたデータ型になっているけれどね。

さらら: そうなのね。

たけち


■リスト(list)型の派生と制約ファセット

たけち: こうやって作った単純型をリスト型と呼ぶんだよ。これに対して今まで扱ってきた「リスト型」でない一塊のデータ型をアトミック型とも呼ぶんだ。

さらら: う〜ん、いろいろなデータ型の分類が出てきて頭が混乱しそう。 (^ ^;

たけち: まあこういう分類もあるというふうに覚えておいてね (^ ^; それからあと、ここで注意したいのは、リスト型を基準型にして、そこから制限(restriction)で派生型を求めたい場合、length, minLength, maxLengthといった制約ファセットがちょっと違った働きをすることだね。

さらら: えっ、???..... (? ?)

たけち: あ、ごめん。。。。。こんな例で考えてみよう。例えば歌人のリスト型を考えてみるね。

さらら

<?xml version="1.0" encoding="Shift_JIS" ?>
<poets>柿本人麻呂 持統天皇 大伴家持 有間皇子</poets>

たけち: これのスキーマは次のように書けるんだ。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poets" type="PoetsType" />

<xsd:simpleType name="PoetsType">
<xsd:list itemType="xsd:Name" />
</xsd:simpleType>

</xsd:schema>

さらら: えぇ。これならわかるわ。

たけち: ここで名前が出てくる歌人を、文字が4文字の人だけに制限してみるね。

さらら: うん。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poets" type="PoetsType" />

<xsd:simpleType name="PoetsType">
<xsd:list itemType="Character4PoetType" />
</xsd:simpleType>

<xsd:simpleType name="Character4PoetType">
<xsd:restriction base="xsd:Name">
<xsd:length value="4" />
</xsd:restriction>

</xsd:simpleType>

</xsd:schema>

たけち: こういう風にすると、
<?xml version="1.0" encoding="Shift_JIS" ?>
<poets>持統天皇 大伴家持 有間皇子</poets>
 には合致するけれど、
<?xml version="1.0" encoding="Shift_JIS" ?>
<poets>柿本人麻呂 持統天皇 大伴家持 有間皇子</poets>
 は、5文字の柿本人麻呂が入っているから駄目だよね。

さらら: えぇ、そうね。

たけち: じゃあ次にこうしてみるね。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poets" type="Poets4Type" />

<xsd:simpleType name="Poets4Type">
<xsd:restriction base="PoetsType">
<xsd:length value="4" />
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="PoetsType">
<xsd:list itemType="xsd:Name" />
</xsd:simpleType>

</xsd:schema>

さらら: さっきと似ているようで違うわ。

たけち: そう、さっきは4文字の歌人のリストのデータ型を作ったけれども、これは歌人のリストのデータ型のlengthを4と制限しているんだ。

さらら: ということは、結果的にやっぱり4文字の歌人のリストになるんじゃないの?

たけち: ところがこの場合はそうじゃないんだ。この場合、リストの項目の数が4に制限されるんだよ。だから、さっきとは逆に、
<?xml version="1.0" encoding="Shift_JIS" ?>
<poets>柿本人麻呂 持統天皇 大伴家持 有間皇子</poets>
 には合致するけれど、
<?xml version="1.0" encoding="Shift_JIS" ?>
<poets>持統天皇 大伴家持 有間皇子</poets>
は項目の数、つまり歌人の人数が3なので、合致しないんだよ。

さらら: そっか〜。。。。制約ファセットのlengthって文字の数じゃない場合もあるのね。

たけち: そうだね。こういうリスト型に制約ファセットのlength、そして他にはminLength、maxLengthを使う場合は、文字の数ではなくて、リストの項目の数になることに注意してね。

さらら: は〜い。。。でも。。。Character4PoetTypeとかPoetsTypeとか、こんな部品になるためだけのデータ型に名前を付けるのって、ちょっとうっと〜しいわねぇ。

たけち: ぎくっ。。。(^ ^;

さらら: あ、その顔は何か隠してるでしょ。たけちったら、すぐ顔に出るんだから。 (^ ^*

たけち: うん、わかったよ。次回は複合型を説明するつもりだったけれど、ちょっと一旦横道にそれて匿名の型定義について説明することにするね。

さらら: は〜い。。。(^ ^* (ふふふ.....)

→ 次回は、匿名の型定義です。。。。 (^ ^)v

たけち


XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。