2014-01-21 45 views
2

中唯一我有這樣的XSD約束ID屬性是XSD文件

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/XXX" 
    xmlns:tns="http://www.example.org/XXX" elementFormDefault="qualified"> 

    <simpleType name="Name"> 
     <restriction base="string"></restriction> 
    </simpleType> 

    <simpleType name="Phone"> 
     <restriction base="string"> 
      <pattern value="\d+"></pattern> 
     </restriction> 
    </simpleType> 

    <simpleType name="Id"> 
     <restriction base="string"> 
      <pattern value="[a-zA-Z]\w+"></pattern> 
     </restriction> 
    </simpleType> 

    <complexType name="User"> 
     <attribute name="Id" type="tns:Id" use="required"></attribute> 
     <attribute name="Name" type="tns:Name" use="required"></attribute> 
     <attribute name="Phone" type="tns:Phone" use="required"></attribute> 
    </complexType> 

    <complexType name="ROOT"> 
     <sequence> 
      <element name="User" type="tns:User" minOccurs="0" maxOccurs="unbounded"> 
       <key name="idUser"> 
        <selector xpath="User"></selector> 
        <field xpath="@Id"></field> 
       </key> 
      </element> 
     </sequence> 
    </complexType> 
    <element name="root" type="tns:ROOT"> 
    </element> 
</schema> 

,我想限制ID字段使得它獨特里面沒有這個文件,但只是樹的一個分支內。顯然在這個例子中沒有任何變化,但是我的想法是,我可以在根元素內部有一系列服務器,並且對於每個服務器,用戶必須是唯一的,但同時可以存在具有相同Id的兩個用戶,如果他們不屬於同一臺服務器。 例如,如果只有s1和s2,這個文檔將是有效的,但它是無效的,因爲s3有兩個內部具有相同id的用戶。

<?xml version="1.0" encoding="UTF-8"?> 
<tns:XXX xmlns:tns="http://www.example.org/XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/XXX schema.xsd "> 
    <tns:Server Id="s1"> 
    <tns:User Id="u1" Name="Name" Phone="12" /> 
    <tns:User Id="u2" Name="Name1" Phone="87654" /> 
    </tns:Server Id="s2"> 
    <tns:Server Id="a2"> 
    <tns:User Id="u2" Name="Name" Phone="12" /> 
    <tns:User Id="u4" Name="Name1" Phone="87654" /> 
    </tns:Server> 
    <tns:Server Id="s3"> 
    <tns:User Id="u2" Name="Name" Phone="12" /> 
    <tns:User Id="u2" Name="Name1" Phone="87654" /> 
    </tns:Server> 
</tns:ACSInfo> 

我試着用鑰匙標籤,但如果我嘗試驗證這個xml它通過,我希望它不能!

<?xml version="1.0" encoding="UTF-8"?> 
<tns:XXX xmlns:tns="http://www.example.org/XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/XXX schema.xsd "> 
    <tns:User Id="a1" Name="Name" Phone="12" /> 
    <tns:User Id="a1" Name="Name1" Phone="87654" /> 
</tns:XXX> 
+0

如果它對你有幫助,請給予回覆/獎勵答案。 –

回答

0

您的模式不正確以強制唯一性。你應該使用xsd:unique。範圍應該是<root/>而不是<User/>

這種嘗試:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://www.example.org/XXX" 
      elementFormDefault="qualified" 
      xmlns="http://www.example.org/XXX" 
      xmlns:tns="http://www.example.org/XXX" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" > 

    <xs:simpleType name="Name"> 
    <xs:restriction base="xs:string" /> 
    </xs:simpleType> 

    <xs:simpleType name="Phone"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="\d+" /> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="Id"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[a-zA-Z]\w+" /> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="User"> 
    <xs:attribute name="Id" type="Id" use="required" /> 
    <xs:attribute name="Name" type="Name" use="required" /> 
    <xs:attribute name="Phone" type="Phone" use="required" /> 
    </xs:complexType> 

    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="User" type="User" 
        minOccurs="0" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="idUser"> 
     <xs:selector xpath="tns:User" /> 
     <xs:field xpath="@Id" /> 
    </xs:unique> 
    </xs:element> 
</xs:schema> 

UPDATE

要改變獨特的範圍只是將其向上一層:

<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Server" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="User" type="User" minOccurs="0" maxOccurs="unbounded" /> 
      </xs:sequence> 
      </xs:complexType> 
      <xs:unique name="idUser"> 
      <xs:selector xpath="tns:User" /> 
      <xs:field xpath="@Id" /> 
      </xs:unique> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

這將允許你重用用戶ID但不在

+0

我在這個問題中增加了一個例子,因爲這裏寫的太長了。你的解決方案的工作原理,但我希望它可以工作,如果用戶標籤放在另一個標籤,如服務器。這是因爲我特別要求複雜類型中的唯一性,而不是整個文檔中的唯一性。 – user2714602

+0

已經用解決方案更新了我的答案 –