属性や要素をキーとして定義する - XML スキーマ - XML プログラミング
PROGRAM
属性や要素をキーとして定義する
XML スキーマで、要素に付けられた属性の値をキー (ID) として扱いたい場合には、次のように定義します。
<xsd:element name="ショッピングモール">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="xxx:ショップ一覧" />
<xsd:element ref="xxx:取扱商品" />
</xsd:sequence>
</xsd:complexType>
<xsd:key name="ショップ識別子">
<xsd:selector xpath="xxx:ショップ一覧/xxx:ショップ" />
<xsd:field xpath="@識別子" />
</xsd:key>
<xsd:keyref name="商品-ショップ" refer="xxx:ショップ識別子">
<xsd:selector xpath="xxx:取扱商品/xxx:商品" />
<xsd:field xpath="@ショップ" />
</xsd:keyref>
</xsd:element>
ここで、接頭辞 xsd は、名前空間 "http://www.w3.org/2001/XMLSchema" です。
また、接頭辞 xxx は、この XML スキーマファイルの "targetNamespace" 名前空間に割り当てている接頭辞です。
ここではまず、ルート要素として "<ショッピングモール>" を定義しています。
その中で "complexType" を指定して、子要素を定義しています。細かい定義についてはここでは省略しています。
そして今回のお話の中で肝心なのが、その次の "<xsd:key>" と "<xsd:keyref>" になります。
まず "<xsd:key>" についてですが、ここでどのフィールドをキーとして扱うかを定義しています。
<xsd:key name="ショップ識別子">
<xsd:selector xpath="xxx:ショップ一覧/xxx:ショップ" />
<xsd:field xpath="@識別子" />
</xsd:key>
"name" 属性でキーに名前をつけたら、その中の "<xsd:selector>" で、今定義している要素(ここでは "<ショッピングモール>" の)どこの要素がキーを持っているかを指定します。
ここでは、この名前空間で定義された "<xxx:ショップ一覧>" の中の "<xxx:ショップ>" 要素が、キーとなる値を持っていることを示しています。要素名を指定する際には、接頭辞も忘れないように注意します。
そして次の "<xsd:field>" では、先ほど "<xsd:selector>" で指定した要素の、どの内容がキーであるかを指定します。
ここでは "@識別子" として、"識別子" という名の属性にある値が指定されています。ここを単に "xxx:識別子" と指定すれば、属性ではなく "<識別子></識別子>" 要素の値がキーとして定義される感じです。このときも、要素の場合は接頭辞を忘れないように注意します。
続く "<xsd:keyref>" では、どのフィールドが、キーとして定義された要素や属性の値として登場する値を持つかを指定しています。
<xsd:keyref name="商品-ショップ" refer="xxx:ショップ識別子">
<xsd:selector xpath="xxx:取扱商品/xxx:商品" />
<xsd:field xpath="@ショップ" />
</xsd:keyref>
"name" 属性で参照に名前をつけたら、続く "refer" 属性で、対象となるキーの名前を指定します。このキーが示す要素や属性が持つ値を、ここで指定する要素が持てることになります。
この参照がどこに設定されるかは、続く "<xsd:selector>" と "<xsd:field>" が示す要素や属性になります。
指定方法はキーのときと同じで、"<xsd:selector>" で、参照を設定する要素や属性がある要素の位置を、続く "<xsd:field>" で、その要素のどの項目が値を持っているかを指定します。こちらも "@属性名" や "接頭辞:要素名" という形で指定します。
これで、キーを定義することができました。
これによって "<xsd:keyref>" で指定された要素や属性の値には、"<xsd:key>" で指定された要素や属性に設定されている値以外は、設定してはいけないという定義ができました。
[ もどる ]