xsd 中的全局 key/unique 属性

global key/unique attribute in xsd

那些日子我一直在努力寻找一种方法来创建一个全局属性,该属性将被架构中的所有元素使用,并将很好地用作它们的 key/unique 属性。 看下一个例子:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
attributeFormDefault="unqualified" targetNamespace="http://www.NameSpace/Family" xmlns:tns="http://www.NameSpace/Family">
<xs:attribute name="id" type="xs:string"/>
<xs:complexType name="parentType">
  <xs:sequence>
    <xs:element name="Name" type="xs:string"/>
    <xs:element name="Child" type="tns:childType" minOccurs="1" maxOccurs="unbounded"/>
  </xs:sequence>  
  <xs:attribute ref="tns:id" use="required"/>  
</xs:complexType>  
<xs:complexType name="childType">
  <xs:sequence>
    <xs:element name="Name" type="xs:string"/>
  </xs:sequence>  
  <xs:attribute ref="tns:id" use="required"/>  
</xs:complexType>
<xs:element name="Family">  
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Parent" type="tns:parentType" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

现在让我们举例来说,我创建了 1 个 parent 和 2 个孩子,我想在 id 属性上定义一个 key/unique 以便 所有元素 id 的 (parents an childs) 将彼此不同

您可以将 id 声明为 xsd:ID 类型,如下所示:

<xs:attribute name="id" type="xs:ID"/>

然后你引用声明的属性(就像你已经做的那样):

<xs:complexType name="parentType">
...
  <xs:attribute ref="tns:id" use="required"/>
</xs:complexType>

您也可以直接在类型或元素上声明 id 属性。

xs:ID 类型对文档中所有 ID 声明的属性全局施加 ID 语义。

要创建密钥,请使用 <xs:key> 元素。在您的例子中,您想要跨 <Family> 元素内的一组元素建立一个键。因此,您的密钥将位于定义 Family.

<xs:element> 标记内
<xs:element name="Family">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Parent" type="tns:parentType" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!-- SOMETHING LIKE THIS WILL DO -->
  <xs:key name="id">
    <xs:selector xpath="tns:Parent|tns:Parent/tns:Child" />
    <xs:field xpath="@tns:id" />
  </xs:key>
</xs:element>

您也可以使用 <xs:unique> 而不是 <xs:key>。两者之间的唯一区别是 <xs:unique> 允许该字段是可选的。在您的情况下,架构定义需要您的 id 属性,使用 <xs:unique><xs:key>.

没有区别