1

那些日子我正在尝试找到一种方法来创建一个全局属性,该属性将被架构中的所有元素使用,并将作为它们的关键/唯一属性。看下一个例子:

<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 个父母和 2 个孩子,我想在 id 属性上定义一个键/唯一,以便所有元素 id(父母和孩子)彼此不同

4

2 回答 2

1

您可以声明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

于 2017-02-28T18:25:57.140 回答
0

要创建密钥,请使用<xs:key>元素。在您的情况下,您希望在元素内的一组元素之间建立一个键<Family>。因此,您的密钥将位于<xs:element>定义Family.

<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>or没有区别<xs:key>

于 2017-02-28T18:35:50.393 回答