我正在做一些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文件中的属性。
答案 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
的空洞限制创建的)。在某些情况下,这种差异可能很重要。