我正在尝试那些日子来找到一种方法来创建一个全局属性,该属性将被架构中的所有元素使用,并将作为它们的关键/唯一属性。 看下一个例子:
<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(父母和孩子)将彼此不同< / strong>即可。
答案 0 :(得分: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
语义。
答案 1 :(得分:0)
要创建密钥,请使用<xs:key>
元素。在您的情况下,您希望在<Family>
元素内的一组元素上建立一个键。因此,您的密钥将位于定义<xs:element>
的{{1}}标记内。
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>
就没有区别。