グローバル属性とグローバル属性宣言 その2

2003年3月16日(日)更新


■いくつかの要素に共通的な属性

さらら: 属性に対する考え方、って?

たけち: うん。その話をするのに、次のXMLデータとDTDを見てみようね。

XMLデータ例: 万葉歌人
<?xml version="1.0" encoding="UTF-8" ?>
<pi:person id="3" xmlns:pi="http://www.yuragi.jp/ns/personalInformation">
<pi:name printColor="black">大伴家持</pi:name>
<pi:sex class="male" printColor="blue" />
<pi:degree class="従三位" printColor="red" />
</pi:person>

DTD: 万葉歌人
<!ELEMENT pi:person (pi:name, pi:sex, pi:degree)>
<!ATTLIST pi:person
    id NMTOKEN #REQUIRED
    xmlns:pi CDATA #FIXED "http://www.yuragi.jp/ns/personalInformation" >
<!ELEMENT pi:name (#PCDATA)>
<!ATTLIST pi:name
    printColor (black | white | blue | red | yellow | green | purple) #IMPLIED >
<!ELEMENT pi:sex EMPTY>
<!ATTLIST pi:sex
class (male | female) #REQUIRED
    printColor (black | white | blue | red | yellow | green | purple) #IMPLIED >
<!ELEMENT pi:degree EMPTY>
<!ATTLIST pi:degree
    class (正一位 | 従一位 | 正ニ位 | 従二位
         | 正三位 | 従三位 | 正四位上 | 正四位下
         | 従四位上 | 従四位下 | 正五位上 | 正五位下
         | 従五位上 | 従五位下 | 正六位上 | 正六位下
         | 従六位上 | 従六位下 | 正七位上 | 正七位下
         | 従七位上 | 従七位下 | 正八位上 | 正八位下
         | 従八位上 | 従八位下 | 大初位上 | 大初位下
         | 少初位上 | 少初位下) #REQUIRED
    printColor (black | white | blue | red | yellow | green | purple) #IMPLIED >

たけち: これは前回の例題にprintColorという属性を加えたものだよ。これは印刷とかモニター上で表示される際に、その文字の色を指定することを目的とした属性だね。3箇所で使われているprintColor属性はすべて同じデータ型だよね。

さらら: そうね。でも、前回の話は要素が違えば同じ名前の属性であっても違うデータ型でもかまわないということで、こんな風に同じデータ型の同じ名前の属性があってもいいのよね。

たけち: こういう同じ名前で同じデータ型の属性があっても構わないんだよ。でもね、これらのprintColor属性が同じデータ型をとっているのは「偶然」なんだろうか?

たけち

さらら: それは違うと思うわ。だって、たけちが、これは印刷とかモニター上で表示される際に、その文字の色を指定することを目的とした属性だって言ったじゃない。だから、同じデータ型になったのよ。

たけち: うん、そうだね。前に、
・属性は、要素やデータ型に所属している
・pi:sex要素のclass属性と「pi:degree要素のclass属性」は別物である
という話をしたよね。

さらら: えぇ。

たけち: でも、この例の場合の
・pi:name要素のprintColor属性
・pi:sex要素のprintColor属性
・pi:degree要素のprintColor属性
は、別物かな?

さらら: う〜ん。さっき言ってたことからすると、同じものなのね、きっと。

たけち: そうなんだよね。
これは印刷とかモニター上で表示される際に、その文字の色を指定することを目的とした属性であれば、テキストがデータとして存在するどんな要素にも、printColor属性は使われてかまわないよね。

さらら: そうなのね。

たけち: それから、名前空間が異なる要素に対してもprintColor属性は使われてかまわないんだよ。

さらら: あっ、そうなの。

たけち: ここで、このことをまとめておくね。

たけち

1.属性は「要素に所属している性質」なので、同じ名前の属性でも、所属する要素が違えば別物と考えられる。

2.所属する要素を越えて、場合によっては名前空間が異なるスキーマも越えて、大域(グローバル)に使われるような属性も考えられる。


■名前空間が異なるスキーマでグローバルに使われる属性

さらら: ねぇ、名前空間が異なるスキーマに使われるグローバルな属性って、どんな風に使うの?

たけち: あっ、そうだね。じゃあ、それを具体的に考えるのに、次の例をみてみようね。

さらら

XMLデータ例: 万葉歌人【personalInformation.xml】
<?xml version="1.0" encoding="Shift_JIS" ?>
<pi:person id="3"
     xmlns:pi="http://www.yuragi.jp/ns/personalInformation"
     xmlns:print="http://www.yuragi.jp/ns/print">

  <pi:name print:color="black">大伴家持</pi:name>
  <pi:sex class="male" print:color="blue" />
  <pi:degree class="従三位" print:color="red" />

</pi:person>

XMLデータ例: 万葉歌【manyouPoem.xml】
<mp:poem pno="4088"
     xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:print="http://www.yuragi.jp/ns/print">

  <mp:poet print:color="black">大伴家持</mp:poet>
  <mp:kana print:color="red">左由理婆奈 由里毛安波牟等
     於毛倍許曽 伊末能麻左可母 宇流波之美須礼</mp:kana>
  <mp:yomi print:color="blue">さ百合花、ゆりも逢はむと、
    思へこそ、今のまさかも、うるはしみすれ</mp:yomi>

</mp:poem>

さらら: なっ、なにこのprint:colorという名前の属性は!? 属性の名前に、名前空間接頭辞が付いているの!?

たけち: あっ、よく気が付いたね。詳しい話は後にして、次にXML Schemaの方を見てみよう。

W3C XML Schema: 万葉歌人【personalInformation.xsd】
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema
     targetNamespace="http://www.yuragi.jp/ns/personalInformation"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:pi="http://www.yuragi.jp/ns/personalInformation"
     xmlns:print="http://www.yuragi.jp/ns/print">

<xsd:import namespace="http://www.yuragi.jp/ns/print"
     schemaLocation="print.xsd" />

<xsd:element name="person" type="pi:PersonType" />

<xsd:complexType name="PersonType">
<xsd:sequence>
  <xsd:element ref="pi:name" />
  <xsd:element ref="pi:sex" />
  <xsd:element ref="pi:degree" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:positiveInteger" />
</xsd:complexType>

<xsd:element name="name" type="pi:NameType" />
<xsd:element name="sex" type="pi:SexType" />
<xsd:element name="degree" type="pi:DegreeType" />

<xsd:complexType name="NameType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
  <xsd:attribute ref="print:color" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="SexType">
  <xsd:attribute name="class" type="pi:SexClassType" />
  <xsd:attribute ref="print:color" />
</xsd:complexType>

<xsd:complexType name="DegreeType">
  <xsd:attribute name="class" type="pi:DegreeClassType" />
  <xsd:attribute ref="print:color" />
</xsd:complexType>

<xsd:simpleType name="SexClassType">
<xsd:restriction base="xsd:string">
  <xsd:enumeration value="male" />
  <xsd:enumeration value="female" />
</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="DegreeClassType">
<xsd:restriction base="xsd:string">
  <xsd:enumeration value="正一位" />
  <xsd:enumeration value="従一位" />
  <xsd:enumeration value="正ニ位" />
  <xsd:enumeration value="従ニ位" />
  <xsd:enumeration value="正三位" />
  <xsd:enumeration value="従三位" />
  <xsd:enumeration value="正四位上" />
  <xsd:enumeration value="正四位下" />
  <xsd:enumeration value="従四位上" />
  <xsd:enumeration value="従四位下" />
  <xsd:enumeration value="正五位上" />
  <xsd:enumeration value="正五位下" />
  <xsd:enumeration value="従五位上" />
  <xsd:enumeration value="従五位下" />
  <xsd:enumeration value="正六位上" />
  <xsd:enumeration value="正六位下" />
  <xsd:enumeration value="従六位上" />
  <xsd:enumeration value="従六位下" />
  <xsd:enumeration value="正七位上" />
  <xsd:enumeration value="正七位下" />
  <xsd:enumeration value="従七位上" />
  <xsd:enumeration value="従七位下" />
  <xsd:enumeration value="正八位上" />
  <xsd:enumeration value="正八位下" />
  <xsd:enumeration value="従八位上" />
  <xsd:enumeration value="従八位下" />
  <xsd:enumeration value="大初位上" />
  <xsd:enumeration value="大初位下" />
  <xsd:enumeration value="少初位上" />
  <xsd:enumeration value="少初位下" />
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>

W3C XML Schema: 万葉歌【manyouPoem.xsd】
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema
     targetNamespace="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:mp="http://www.yuragi.jp/ns/manyouPoem"
     xmlns:print="http://www.yuragi.jp/ns/print">

<xsd:import namespace="http://www.yuragi.jp/ns/print"
     schemaLocation="print.xsd" />

<xsd:element name="poem" type="mp:PoemType" />

<xsd:complexType name="PoemType">
<xsd:sequence>
<xsd:element ref="mp:poet" />
<xsd:element ref="mp:kana" />
<xsd:element ref="mp:yomi" />
</xsd:sequence>
<xsd:attribute name="pno" type="xsd:positiveInteger" />
</xsd:complexType>

<xsd:element name="poet" type="mp:PoetType" />
<xsd:element name="kana" type="mp:KanaType" />
<xsd:element name="yomi" type="mp:YomiType" />

<xsd:complexType name="PoetType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="print:color" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="KanaType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="print:color" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:complexType name="YomiType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute ref="print:color" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

</xsd:schema>

W3C XML Schema: color属性【print.xsd】
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema
     targetNamespace="http://www.yuragi.jp/ns/print"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:print="http://www.yuragi.jp/ns/print">

<xsd:attribute name="color" type="print:ColorType" />

<xsd:simpleType name="ColorType">
<xsd:restriction base="xsd:string">
  <xsd:enumeration value="black" />
  <xsd:enumeration value="white" />
  <xsd:enumeration value="blue" />
  <xsd:enumeration value="red" />
  <xsd:enumeration value="yellow" />
  <xsd:enumeration value="green" />
  <xsd:enumeration value="purple" />
</xsd:restriction>
</xsd:simpleType>


</xsd:schema>

さらら: あら、この【print.xsd】スキーマファイルって、要素宣言が存在しないのね。要素みたいに独立してcolorという属性が宣言されているの!?

さらら: 名前空間に直接、所属している「グローバル属性」...

たけち: colorという属性は、本来、piという接頭辞で表される名前空間の要素やデータ型(要素型)に属すべきでもないし、mpという接頭辞で表される名前空間の要素やデータ型(要素型)に属すべきでもないよね。ここではprintという接頭辞で表した別の名前空間に所属する存在なんだね。
でも、これはあくまで属性で、要素じゃないからprintという接頭辞で表した名前空間に直接、所属した属性として宣言しているんだよ。
そしてpiのスキーマからもmpのスキーマからも、この属性をimportで参照して組み込んでいるわけなんだね。

さらら

さらら: なるほどねぇ... つまり、「グローバル属性宣言」を使って宣言された属性が「グローバル属性」なのね。それはこういうふうに、直接的に名前空間に所属するものとして宣言されて、要素の違いどころか、場合によっては名前空間の異なるスキーマの違いも越えて、グローバルにいろいろな要素の中で使われるってわけなのね。

たけち: う〜ん... そう言い切ってしまうとすっきりするしだけど... 実はちょっと違うんだ。

さらら: えっ??

たけち: そうだね。その前に、ちょっと休憩しようね。

さらら: え、えぇ(^ ^;)

次回はグローバル属性とグローバル属性宣言 その3です...... (^ ^;


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