AccountStructureItem および EventItem タイプの 2 つのリスト (「AccountStructures」および「Events」) を含む Event という名前の xsd があります。AccountStructureItem に SourceId というプロパティがあり、一意かつキーとして定義されています。EventItem タイプには、AccountStructureItem の SourceId への参照である SourceId プロパティもあります。
AccountStructureItem の ID を次のように宣言しました。
<xs:unique name="accounts_unique">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:unique>
<xs:key name="accounts_key">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:key>
この関係は 1 対多であり、同じ AccountStructureItem の SourceId を参照する多くの EventItem が存在する可能性があります。したがって、EventItem のキーは別のプロパティです。
私の質問: 以下の xs:keyref を使用して、accountstructure の accounts_key に keyreference 制約を作成しようとすると、エラーが発生します。
<xs:keyref name="events_constraint" refer="accounts_key">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:keyref>
検証に続くエラー メッセージは次のとおりです。
以下に示す完全な XSD とテスト xml ファイルを参照してください。
<!-- XSD -->
<xs:element name="Event">
<xs:complexType>
<xs:sequence>
<!--Information Start-->
<xs:element minOccurs="1" maxOccurs="1" nillable="false" name="Information" type="ct:Information" />
<!--Information End-->
<!--AccountStructure Start-->
<xs:element name="AccountStructures">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="AccountStructureItem">
<xs:complexType>
<xs:complexContent mixed="false">
<xs:extension base="ct:AccountStructureItem" />
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="accounts_unique">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:unique>
<xs:key name="accounts_key" id="accounts_key_id">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:key>
</xs:element>
<!--AccountStructure End-->
<!--Events Start-->
<xs:element name="Events" minOccurs="1" maxOccurs="1" nillable="false">
<xs:complexType>
<xs:sequence>
<xs:element name="EventItem" minOccurs="1" maxOccurs="10000">
<xs:complexType>
<xs:complexContent mixed="false">
<xs:extension base="ct:EventItem" />
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="events_unique">
<xs:selector xpath="EventItem"/>
<xs:field xpath="SourceEventId"/> <!-- events has a different key -->
</xs:unique>
<xs:key name="events_key">
<xs:selector xpath="EventItem"/>
<xs:field xpath="SourceEventId"/> <!-- events has a different key -->
</xs:key>
<xs:keyref name="events_constraint" refer="accounts_key">
<xs:selector xpath="AccountStructureItem"/>
<xs:field xpath="SourceId"/>
</xs:keyref>
</xs:element>
<!--Events End-->
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- XML -->
<AccountStructures>
<AccountStructureItem>
<SourceId>AC1</SourceId>
<AccountStructureType>Site</AccountStructureType>
<ParentSourceId>000017252</ParentSourceId>
<Name>Oras Isometsän tehdas</Name>
<Street>Isometsäntie 2</Street>
<City>RAUMA</City>
</AccountStructureItem>
<AccountStructureItem>
<SourceId>AC2</SourceId>
<AccountStructureType>Site</AccountStructureType>
<ParentSourceId>000017252</ParentSourceId>
<Name>Oras Oy lomamökki</Name>
<Street>Lomapolku 15</Street>
<City>RAUMA</City>
</AccountStructureItem>
</AccountStructures>
<Events>
<EventItem>
<SourceId>AC1</SourceId>
<AccountStructureType>SiteLocation</AccountStructureType>
<SourceEventId>123</SourceEventId>
<EventDate>2012-06-20T17:57:26</EventDate>
<EventText>
<EnglishValue> Oras/Isometsän tehdas Oras Isometsä </EnglishValue>
<LocalValue> Oras/Isometsän tehdas Oras Isometsä </LocalValue>
</EventText>
<Objects>
<Object>
<EnglishValue>Location</EnglishValue>
<LocalValue>Location</LocalValue>
</Object>
</Objects>
<Type>
<EnglishValue>Round</EnglishValue>
<LocalValue>Round</LocalValue>
</Type>
<Solutions>
<Solution>
<EnglishValue>On-site</EnglishValue>
<LocalValue>On-site</LocalValue>
</Solution>
</Solutions>
<EventValue>
<UnitType>Integer</UnitType>
<Value>1</Value>
</EventValue>
<Notes></Notes>
</EventItem>
<EventItem>
<SourceId>AC1</SourceId>
<AccountStructureType>SiteLocation</AccountStructureType>
<SourceEventId>1234</SourceEventId>
<EventDate>2012-06-20T17:57:26</EventDate>
<EventText>
<EnglishValue> Oras/Isometsän tehdas Oras Isometsä </EnglishValue>
<LocalValue> Oras/Isometsän tehdas Oras Isometsä </LocalValue>
</EventText>
<Objects>
<Object>
<EnglishValue>Location</EnglishValue>
<LocalValue>Location</LocalValue>
</Object>
</Objects>
<Type>
<EnglishValue>Round</EnglishValue>
<LocalValue>Round</LocalValue>
</Type>
<Solutions>
<Solution>
<EnglishValue>On-site</EnglishValue>
<LocalValue>On-site</LocalValue>
</Solution>
</Solutions>
<EventValue>
<UnitType>Integer</UnitType>
<Value>1</Value>
</EventValue>
<Notes></Notes>
</EventItem>
</Events>