データ型: 単純型と複合型

2002年6月23日(日)更新


■要素で使えるデータ型と属性で使えるデータ型

たけち: 前回までに「要素を宣言するためには、まずデータ型が必要」という話と、「属性を宣言するためには、まずデータ型が必要」という話をしたよね。

さらら: えぇ〜っと。。要するに要素の宣言でも属性の宣言でも、まずはデータ型が必要だってことだったわね。

たけち: あっ、よく覚えてたね。でも、要素で使えるデータ型と属性で使えるデータ型にはちょっとした違いがあるんだよ。

さらら: へっ? それってどういうこと?

たけち: ん。じゃあ、そのあたりをお話するね。まずは、次の例を見てごらん。

たけち

要素の例

たけち: この(1)(2)(3)の要素っておかしいところはあるかな?

さらら: う〜ん、そうねぇ。。。別におかしいように見えないわ。

たけち: そうだよね。これはいいよね。じゃあ、次の例を見てごらん。

属性の例

さらら: (4)(5)はおかしくないけれども、(6)はなんだかおかしいわ。。。。

たけち: どこがおかしいと思う?

さらら: う〜。。。あっ、pという属性の値に、mkana要素やyomi要素があるのがおかしいわ! 属性の値に要素を使っちゃいけないのよね。そうでしょ。

たけち: そうだよね。属性の値としてはテキストが使えるけれども、要素を使えるわけがないよね。同様にスキーマについて考えてみよう。次を見て。

さらら

<xsd:element name="number" type="xsd:int" />
<xsd:attribute name="number" type="xsd:int" />

たけち: これは2つともおかしくないよね。

さらら: そうね。一つ目は整数型のnumber要素、それから整数型のnumber属性ってことよね。

たけち: うん。以前、次のようなPoemType型の定義を紹介したのを覚えているかな?

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="mkana" />
<xsd:element ref="yomi" />
</xsd:sequence>
</xsd:complexType>

さらら: えぇ、このPoemType型を使ってpoem要素を宣言したんだったわね。

たけち: うん。じゃあね、つぎの二つの宣言を見てどう思う? PoemTypeは上で示したデータ型とするね。

<xsd:element name="number" type="PoemType" />
<xsd:attribute name="number" type="PoemType" />

さらら: 1番目の要素の宣言はいいと思うわ。。。。。。でも、2番目の属性の宣言はおかしいわ。だって、さっきの例と同じように、属性の値として要素を使っちゃいけないのよ。

たけち: そう、さららの言う通り。つまりここでわかるのは、要素の宣言には使えるけれども、属性の宣言には使えないデータ型があるということだよね。

さらら: そうなのね。というよりも、中身がテキストのデータ型以外は全部属性の宣言には使えないじゃない。

たけち: そう、中身がテキストだけのデータ型は、要素の宣言にも属性の宣言にも使えるんだよね。でも、そうじゃないデータ型、例えば内容に要素が入っているようなデータ型は、要素の宣言には使えても、属性の宣言には使えないんだ。

さらら: ということは、データ型は2種類に分けられる、ってことなのね。

たけち


■単純型と複合型

たけち: そう、そうなんだ。この内容がテキストだけからなって要素の宣言にも属性の宣言にも使えるデータ型のことを単純型(Simple Type)と呼ぶんだ。それに対して、「単純型」じゃないデータ型はみんな複合(Complex Type)なんだよ。

さらら: なるほど。内容に要素が入っているようなデータ型が複合型なのね。

たけち: まあだいたいそうなんだけれど、内容がテキストでも、それに属性がついているのも複合型だよ。例えば、次のような要素を定義するデータ型は属性の宣言に使えないからね。

さらら

<yomi pno="8">熟田津に船乗りせむと月待てば潮もかなひぬ今は漕ぎ出でな</yomi>

さらら: あ、そうか。。。。。 (^ ^;

単純型と複合型


■空要素のデータ型も複合型

たけち: それに「もっとも単純な複合型」ってどんなものかわかる?

さらら: もっとも単純な複合型?

たけち: 空要素のデータ型だよ。たとえば、<kara />みたいな形式だね。

さらら: えー、こんな一番単純な形が「複合型」なの?

たけち: どうしてかって言うと、「内容がテキストじゃない」んだものね。「内容が空」だと属性の宣言には使えないってこと、わかるよね。

さらら: そうねぇ。確かに言われてみればそうよね。これってどう定義するの?

たけち: 例えばつぎのように書けばいいんだよ。

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

<xsd:element name="kara" type="KaraType" />

<xsd:complexType name="KaraType" />

</xsd:schema>

さらら: えっ、こんなふうに書くの? ふぅ〜ん。。。。<xsd:complexType name="KaraType" />って、何かいまひとつ納得できないような、不思議な書き方ね。

たけち: 確かにそうだね(^^;) こう書くことにはきちんとした意味があるのだけれど、それはまた後で説明するね。次回はまず「単純型」から説明することにするよ。

さらら: は〜い。ありがと。

→ 次回は、単純型です。。。。 (^ ^)v

さらら


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