1

我正在做一些 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 文件中的属性。

4

2 回答 2

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”。

于 2013-10-24T19:11:55.093 回答
1

属性的声明需要指定属性的类型;这可以通过type指定类型名称的属性或匿名类型的内联声明来完成。

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

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

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

于 2013-10-27T23:10:55.313 回答