2012-08-09 31 views
2

我有一个xsd命名的Event,其中包含AccountStructureItem和EventItem类型的两个列表(“AccountStructures”和“Events”)。有一个属性:AccountStructureItem中的SourceId被定义为唯一和密钥。 EventItem类型还有一个SourceId属性,它是对AccountStructureItem的SourceId的引用。XSD架构参考完整性xs:keyref

我宣布AccountStructureItem's 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> 

的关系是一对多的,可以有很多EventItem's指同一AccountStructureItem's的SourceID。因此EventItem的关键是另一个属性。

我的问题:尝试使用下面的xs:keyref为accountstructure的accounts_key创建密钥引用约束时出错。

<xs:keyref name="events_constraint" refer="accounts_key"> 
<xs:selector xpath="AccountStructureItem"/> 
<xs:field xpath="SourceId"/> 
</xs:keyref> 

在验证下面的错误消息如下:“该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> 

回答

3

我自己拿到了解决方案。问题在于我在元素列表中声明了键和引用。我现在将这个关键字,唯一关键字和ref参数的声明移到了两个列表之外,并使用“list/item”xpath来访问它们。就像这样:

<xs:selector xpath="AccountStructures/AccountStructureItem"/> 
    <xs:field xpath="SourceId"/> 
</xs:unique> 

<xs:key name="accounts_key" id="accounts_key_id"> 
    <xs:selector xpath="AccountStructures/AccountStructureItem"/> 
    <xs:field xpath="SourceId"/> 
</xs:key> 

<xs:unique name="events_unique"> 
    <xs:selector xpath="Events/EventItem"/> 
    <xs:field xpath="SourceEventId"/> 
</xs:unique> 

<xs:key name="events_key"> 
    <xs:selector xpath="Events/EventItem"/> 
    <xs:field xpath="SourceEventId"/> 
</xs:key> 

<xs:keyref name="events_constraint" refer="accounts_key"> 
    <xs:selector xpath="Events/EventItem"/> 
    <xs:field xpath="SourceId"/> 
</xs:keyref>