2012-10-09 87 views
1

經過幾個小時的嘗試,我仍然無法得到這個簡單的例子來做我想要的。目標非常簡單:只有在每個Node分配有唯一的NoteID時,帶有Notes的xml文檔纔有效。XML架構:唯一性約束

這裏是我的Notes.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://xml.netbeans.org/schema/Notes" 
      xmlns:tns="http://xml.netbeans.org/schema/Notes" 
      elementFormDefault="qualified"> 
    <xsd:element name="Notes"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="Note" maxOccurs="unbounded"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="NoteID" type="xsd:positiveInteger"/> 
          <xsd:element name="Content" type="xsd:string"/> 
         </xsd:sequence> 
        </xsd:complexType> 
        <xsd:unique name="newKey"> 
         <xsd:selector xpath="."/> 
         <xsd:field xpath="NoteID"/> 
        </xsd:unique> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

而且Notes.xml

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:Notes xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' 
      xmlns:ns0='http://xml.netbeans.org/schema/Notes' 
      xsi:schemaLocation='http://xml.netbeans.org/schema/Notes Notes.xsd'> 
    <ns0:Note> 
     <ns0:NoteID>1</ns0:NoteID> 
     <ns0:Content>this</ns0:Content> 
    </ns0:Note> 
    <ns0:Note> 
     <ns0:NoteID>1</ns0:NoteID> 
     <ns0:Content>is a</ns0:Content> 
    </ns0:Note> 
    <ns0:Note> 
     <ns0:NoteID>3</ns0:NoteID> 
     <ns0:Content>test</ns0:Content> 
    </ns0:Note> 
</ns0:Notes> 

而且我不知道爲什麼這驗證了:

$ xmllint --noout -schema Notes.xsd Notes.xml 
Notes.xml validates 

回答

2

xsd:unique是在錯誤的地方,您需要明確的名稱空間前綴xpath s。

這工作:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://xml.netbeans.org/schema/Notes" 
      xmlns:tns="http://xml.netbeans.org/schema/Notes" 
      elementFormDefault="qualified"> 
    <xsd:element name="Notes"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Note" maxOccurs="unbounded"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="NoteID" type="xsd:positiveInteger"/> 
       <xsd:element name="Content" type="xsd:string"/> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    <xsd:unique name="newKey"> 
     <xsd:selector xpath="tns:Note"/> 
     <xsd:field xpath="tns:NoteID"/> 
    </xsd:unique> 
    </xsd:element> 
</xsd:schema> 
+0

非常感謝你! – aka