2015-10-07 139 views
1

我試圖通過不同元素類型的共享屬性唯一性約束添加。所有這些元素共享一組通用屬性,使用attributeGroup定義。獨特屬性

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:attributeGroup name="commonAttributes"> 
    <xs:attribute name="id" type="xs:string" use="required" /> 
    <xs:attribute name="displayName" type="xs:string" /> 
    </xs:attributeGroup> 

    ... 
    <xs:element name="mainType" minOccurs="0"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="firstType" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:attributeGroup ref="commonAttributes"></xs:attributeGroup> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="secondType" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:attributeGroup ref="commonAttributes"></xs:attributeGroup> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    ... 
</xs:schema> 

基本上,兩者firstTypesecondType元素定義id屬性,它需要有唯一值進行的跨每個mainType實例。從我讀過的內容來看,unique約束不能在xs:attributeGroup內設置。在firstTypesecondType元素上設置此限制顯然僅適用於該類型的其他元素,這意味着firstType元素的實例可以具有與secondType元素相同的id值。

mainType元素中定義的所有類型中,是否有使id屬性唯一的方法?將單個元素名稱設置爲屬性將意味着重大的代碼更改和規範的隱式更改(我非常想不觸發)。

回答

1

使用*(或firstType | secondType)作爲XPath表達式。

試試這個:

 <xs:unique name="uniqueAttr"> 
      <xs:selector xpath="*"></xs:selector> 
      <xs:field xpath="@id"></xs:field> 
     </xs:unique> 

使用上面的代碼你mainType元素中,如下所示:

<xs:element name="mainType" > 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="firstType" minOccurs="0" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:attributeGroup ref="commonAttributes"></xs:attributeGroup> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="secondType" minOccurs="0" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:attributeGroup ref="commonAttributes"></xs:attributeGroup> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:unique name="uniqueAttr"> 
      <xs:selector xpath="*"></xs:selector> 
      <xs:field xpath="@id"></xs:field> 
     </xs:unique> 
    </xs:element> 
+0

是的,這確實起作用。從中可以看出,XPath有助於抽象不同的元素類型。無論節點名稱如何,「*」的意思是「所有孩子」。 –