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>
.
没有区别
那些日子我一直在努力寻找一种方法来创建一个全局属性,该属性将被架构中的所有元素使用,并将很好地用作它们的 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>
.