XSD带有类型的属性和带限制的属性有什么区别?

时间:2013-10-24 11:10:08

标签: xsd xsd-validation

我正在做一些xsd清理活动,对XSD知识有限。我所拥有的文件包含一个复杂元素,其中定义了两个属性,但不同。

<xs:attribute name="DecisioningRequestType" 
              type="xs:string" 
              use="required"/>

<xs:attribute name="ProcessingRequestType" 
              use="required">
  <xs:simpleType>
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
</xs:attribute>

当创建xml时,两个属性都包含一个字符串值,但我试图理解当使用限制定义属性时它会产生什么差异?是不是我可以定义我的第二个属性,类似于上面显示的第一个属性?

如果相同,我可以通过此清理统一定义XSD文件中的属性。

2 个答案:

答案 0 :(得分:2)

带限制的属性意味着定义了属性值的类型 内联,直接在属性本身的定义内。

一方面,当属性类型是特殊的(不仅仅是基本类型)时,使用它,但另一方面,它仅用于该属性。 因此,将该类型定义为单独的组件将是多余的。

但在你的情况下,构造:

<xs:attribute name="ProcessingRequestType" use="required">
  <xs:simpleType>
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
</xs:attribute>

虽然有效,但实际上并不限制任何东西(它是一个空的限制)。 所以,它相当于

<xs:attribute name="ProcessingRequestType" type="xs:string" use="required"/>

真正的限制看起来像这样:

<xs:attribute name="ProcessingRequestType" use="required">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="typeA"/>
      <xs:enumeration value="typeB"/>
      <xs:enumeration value="typeC"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

这意味着属性值是一个字符串,但仅限于列表中的一个:“typeA”,“typeB”,“typeC”。

答案 1 :(得分:1)

属性声明要求指定属性的类型;这可以通过type属性给出类型的名称,或者使用匿名类型的内联声明来完成。

使用或不使用XSD restriction元素与type属性和simpleType子元素之间的差异正交。在你给出的情况下,restriction是空的;内联声明可以很容易地采用

形式
<xs:simpleType>
  <xs:union memberTypes="xs:string"/>
</xs:simpleType>

你写这两个属性都包含一个字符串值 - 这是真的,就其而言,的两个属性具有相同的类型:与xs:string类型相关联,另一个与匿名类型相关联,其值和词汇空间与xs:string的相同(因为它是由xs:string的空洞限制创建的)。在某些情况下,这种差异可能很重要。