2016-07-19 36 views
1

Ich versuche, eine XSD für ein XML zu erstellen und eine xs:unique Constraint erzwingen, aber es erzwingt nicht die Einschränkung. Was mache ich falsch?Eindeutiges Element in XSD wird nicht erzwungen

Hier ist die XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      vc:minVersion="1.1" 
      xmlns:o="http://www.osames.org/osamesorm"> 
    <xs:element name="DATA"> 
    <xs:annotation> 
     <xs:documentation>Element that contain data</xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="ACCOUNTID" type="xs:string"/> 
     <xs:element name="CONTACTS" type="CONTACTType"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="unique-contactid"> 
     <xs:selector xpath="o:CONTACT"/> 
     <xs:field xpath="@ID"/> 
    </xs:unique>  
    </xs:element> 
    <xs:element name="CONTACT"> 
    <xs:annotation> 
     <xs:documentation> 
     Contact Element contain one contact configuration/data 
     </xs:documentation> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="ID" type="xs:int"/> 
     <xs:element name="TITLE" type="xs:string"/> 
     <xs:element name="TYPE" type="xs:int"/> 
     <xs:element name="CONTACTSTRING" type="xs:string"/> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="CONTACTType"> 
    <xs:annotation> 
     <xs:documentation>Complex Contect Type</xs:documentation> 
    </xs:annotation> 
    <xs:sequence> 
     <xs:element ref="CONTACT" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

und hier ist ein XML, die ungültig sein sollte, weil 2 Kontakte gleiche ID haben (0)

<?xml version="1.0" encoding="UTF-8"?> 
<DATA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="Untitled4.xsd"> 
    <ACCOUNTID>String</ACCOUNTID> 
    <CONTACTS> 
     <CONTACT> 
      <ID>0</ID> 
      <TITLE>String</TITLE> 
      <TYPE>0</TYPE> 
      <CONTACTSTRING>String</CONTACTSTRING> 
     </CONTACT> 
     <CONTACT> 
      <ID>0</ID> 
      <TITLE>String</TITLE> 
      <TYPE>0</TYPE> 
      <CONTACTSTRING>String</CONTACTSTRING> 
     </CONTACT> 
    </CONTACTS> 
</DATA> 

nun sicher, was mache ich falsch.

Antwort

0

Ihre xs:unique Erklärung,

<xs:unique name="unique-contactid"> 
     <xs:selector xpath="o:CONTACT"/> 
     <xs:field xpath="@ID"/> 
    </xs:unique>       

hat mehrere Probleme, die Sie lösen müssen:

  1. CONTACT ist nicht in einem Namespace; Lassen Sie die o: fallen.
  2. CONTACT ist innerhalb CONTACTS; Fügen Sie dieses Element dem XPath hinzu.
  3. ist kein Attribut, sondern ein Element; Wechseln Sie zu ID.

Insgesamt dann die folgende xs:unique Erklärung,

<xs:unique name="unique-contactid"> 
     <xs:selector xpath="CONTACTS/CONTACT"/> 
     <xs:field xpath="ID"/> 
    </xs:unique>      

wird wie gewünscht funktionieren.

+0

Vielen Dank. Arbeitete perfekt –