xsd

时间:2017-02-28 18:02:46

标签: xml xsd xsd-1.0

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

<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>即可。

2 个答案:

答案 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>就没有区别。