2014-11-23 88 views
0

我已声明用户/ url为主键。但我的验证器仍然接受相同的url值。我错过了什么?XML主键约束不起作用

是否有其他方式指定主键约束?还是我对xsd的理解不够?

感谢

我的XML:

<?xml version="1.0"?> 

<user_list xmlns="http://www.cse532.com" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.cse532.com schema.xsd"> 


<user> 
    <name>Bob</name> 
    <url>http://www.cse532.com/bob</url> 
    <work_history> 
     <company>Stony Brook</company> 
     <from_date>2013-08-01</from_date> 
     <to_date>2013-12-31</to_date> 
    </work_history> 
    <work_history> 
     <company>Microsoft</company> 
     <from_date>2014-01-01</from_date> 
     <to_date>2014-12-31</to_date> 
    </work_history> 
    <skills> 
     <skill>Programming</skill> 
    </skills> 
    <endorsements> 
     <url>http://www.cse532.com/alice</url> 
     <skill>Programming</skill> 
    </endorsements> 
    <endorsements> 
     <url>http://www.cse532.com/alice</url> 
     <skill>Instructor</skill> 
    </endorsements> 
    <endorsements> 
     <url>http://www.cse532.com/carol</url> 
     <skill>Programming</skill> 
    </endorsements> 
</user> 

<user> 
    <name>Bob</name> 
    <url>http://www.cse532.com/bob</url> 
    <work_history> 
     <company>Stony Brook</company> 
     <from_date>2013-08-01</from_date> 
     <to_date>2013-12-31</to_date> 
    </work_history> 
    <work_history> 
     <company>Microsoft</company> 
     <from_date>2014-01-01</from_date> 
     <to_date>2014-12-31</to_date> 
    </work_history> 
    <skills> 
     <skill>Programming</skill> 
    </skills> 
    <endorsements> 
     <url>http://www.cse532.com/alice</url> 
     <skill>Programming</skill> 
    </endorsements> 
    <endorsements> 
     <url>http://www.cse532.com/alice</url> 
     <skill>Instructor</skill> 
    </endorsements> 
    <endorsements> 
     <url>http://www.cse532.com/carol</url> 
     <skill>Programming</skill> 
    </endorsements> 
</user> 

我的xsd:

<!-- Definition of simple elements. --> 
<xs:element name="name" type="xs:string"/> 
<xs:element name="url" type="xs:string"/> 
<xs:element name="company" type="xs:string"/> 
<xs:element name="from_date" type="xs:string"/> 
<xs:element name="to_date" type="xs:string"/> 
<xs:element name="skill" type="xs:string"/> 

<!-- Definition of complex elements. --> 
<xs:element name="work_history"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="company"/> 
      <xs:element ref="from_date"/> 
      <xs:element ref="to_date"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="skills"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="skill"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="endorsements"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="url"/> 
      <xs:element ref="skill"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="user"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="name" maxOccurs="1"/> 
      <xs:element ref="url"/> 
      <xs:element ref="work_history" minOccurs="0" maxOccurs="unbounded"/> 
      <xs:element ref="skills" minOccurs="0" maxOccurs="unbounded"/> 
      <xs:element ref="endorsements" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<!-- "user_list" is the root element of this schema. --> 
<xs:element name="user_list"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element ref="user" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <!-- Primary key and foreign key definitions. --> 
    <xs:key name="PKuser_url"> 
     <xs:selector xpath="user"/> 
     <xs:field xpath="url"/> 
    </xs:key> 
    <xs:key name="PKwork_history"> 
     <xs:selector xpath="user/work_history"/> 
     <xs:field xpath="company"/> 
     <xs:field xpath="from_date"/> 
    </xs:key> 
    <xs:key name="PKskills"> 
     <xs:selector xpath="user/skills"/> 
     <xs:field xpath="skill"/> 
    </xs:key> 
    <xs:key name="PKendorsements"> 
     <xs:selector xpath="user/endorsements"/> 
     <xs:field xpath="url"/> 
     <xs:field xpath="skill"/> 
    </xs:key> 
    <xs:keyref name="FKurl" refer="PKuser_url"> 
     <xs:selector xpath="user/endorsements"/> 
     <xs:field xpath="url"/> 
    </xs:keyref> 
    <xs:keyref name="FKskill" refer="PKskills"> 
     <xs:selector xpath="user/endorsements"/> 
     <xs:field xpath="skill"/> 
    </xs:keyref> 
</xs:element> 
</xs:schema> 

回答

1

您的实例文档都有一个默认的命名空间,所以在你的约束XPath表达式(XPath的=“user”,xpath =“url”)是无效的,因为它们在没有命名空间中选择元素。