XSD - 需要2个属性中的一个?

时间:2009-04-18 07:13:16

标签: xsd

有没有办法指定XSD中需要2个属性中的一个?

例如,我有一个这样的定义:

<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Id" type="xs:string" use="optional" />

我希望能够定义至少需要其中一个。这可能吗?

5 个答案:

答案 0 :(得分:42)

不,我认为你不能用属性做到这一点。你可以将两个<xs:element>包装成一个<xs:choice> - 但是对于属性,我恐怕没有等效的构造。

答案 1 :(得分:21)

XSD 1.1将允许您使用断言。

<xsd:element name="remove">
    <xsd:complexType>                        
        <xsd:attribute name="ref" use="optional"/>
        <xsd:attribute name="uri" use="optional"/>
        <xsd:assert test="(@ref and not(@uri)) or (not(@ref) and @uri)"/>            
    </xsd:complexType>
</xsd:element>

答案 2 :(得分:9)

Marc非常正确...你不能在XSD中的xs:choice父元素中使用xs:attribute子元素。

逻辑似乎是,如果一个元素的两个实例具有互斥的属性集,那么它们在逻辑上就是两个不同的元素。

Jeni Tennison提出了解决方法here

答案 3 :(得分:5)

您应该在W3C wiki上查看此页面:Simple attribute implicationAttribute muttex

答案 4 :(得分:-2)

该示例定义了一个名为&#34; person&#34;的元素。必须包含&#34;员工&#34;元素或&#34;成员&#34;元件。

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>