XML スキーマでkey & keyrefを使用して、xml ドキュメントに参照整合性を実装したいと考えています。
私のXMLが次のようになっているとしましょう:
<root>
<parents>
<parent parentID="P01">XXX</parent>
<parent parentID="P02">XXX</parent>
</parents>
<sons>
<son sonID="S01" parentID="P01">XXX</son>
<son sonID="S02" parentID="P02">XXX</son>
<son sonID="S03" parentID="P02">XXX</son>
</sons>
</root>
たとえば、私の XML では、parentID属性を親要素の主キーとして定義したいと考えています。
ルート要素内で対応するxs:keyを宣言します。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="root" type="myRootType" >
<xs:key name="parentKey">
<xs:selector xpath="./parents/parent" />
<xs:field xpath="@parentID"/>
</xs:key>
</xs:element>
<xs:complexType name="myRootType">
<xs:sequence>
....
上記の例のように、 xs:selector要素のxpath属性で相対パス ("./parents/parent) を使用すると、問題なく動作します (2 つの親が同じ ID を持つ場合、検証でエラーが発生します) 。
ただし、代わりに絶対パス ("/root/parents/parent") を使用すると、ID 制限は機能しません。
どうしてこれなの?私の理解では、両方の方法で機能するはずです(XPath式で絶対パスまたは相対パスを使用します。