XML Schema:为什么<xs:all>不能有<choice>子元素?如何绕过这个?</choice> </xs:all>

时间:2009-04-23 08:42:20

标签: xml xsd

我正在尝试为<property>元素创建一个模式,该模式必须包含<key>个子元素,以及<val><shell>或{{1}之一和一个可选的<perl><os>,子元素的顺序无关紧要。

以下是有效<condition>元素的一些示例:

<property>

理想情况下,我考虑过使用<property> <key>A</key> <val>b</val> </property> <property> <key>A</key> <val>b</val> <os>Windows</os> </property> <property> <condition>a == 1</condition> <key>A</key> <perl>1+1</perl> <os>unix</os> </property>

<xs:all>

但我发现<xs:element name="property"> <xs:complexType> <xs:all> <xs:element name="key" type="xs:string" /> <xs:choice> <xs:element name="val" type="xs:string" /> <xs:element name="perl" type="xs:string" /> <xs:element name="shell" type="xs:string" /> </xs:choice> <xs:element name="os" type="xs:string" minOccurs="0" /> <xs:element name="condition" type="xs:string" minOccurs="0" /> </xs:all> </xs:complexType> </xs:element> 只能包含<xs:all>而不能包含<xs:element>。有人可以解释为什么会这样吗?

更重要的是,有人可以提供验证此类<xs:choice>元素的方法吗?

我可以将这三个元素 - <property><val><perl> - 作为<shell>中的可选元素,但我希望架构能够验证该元素元素中存在三个中的一个。可以这样做吗?

2 个答案:

答案 0 :(得分:22)

我认为这有点好,因为“选择”现在是它自己的元素(typeFacet),但不能直接使用,因为它是抽象的。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="property">
    <xs:complexType>
      <xs:all>
        <xs:element name="key" type="xs:string" />
        <xs:element ref="typeFacet" />
        <xs:element name="os" type="xs:string" minOccurs="0" />
        <xs:element name="condition" type="xs:string" minOccurs="0" />
      </xs:all>
    </xs:complexType>
  </xs:element>

  <xs:element name="typeFacet" abstract="true" />
  <xs:element name="val" type="xs:string"   substitutionGroup="typeFacet" />
  <xs:element name="perl" type="xs:string" substitutionGroup="typeFacet" />
  <xs:element name="shell" type="xs:string" substitutionGroup="typeFacet" />
</xs:schema>

答案 1 :(得分:7)

基于newt关于使用替换组进行选择的评论(使用xmllint测试):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="property">
    <xs:complexType>
      <xs:all>
        <xs:element name="key" type="xs:string" />
        <xs:element ref="val"/>
        <xs:element name="os" type="xs:string" minOccurs="0" />
        <xs:element name="condition" type="xs:string" minOccurs="0" />
      </xs:all>
    </xs:complexType>
  </xs:element>

  <xs:element name="val" type="xs:string"/>
  <xs:element name="perl" type="xs:string" substitutionGroup="val" />
  <xs:element name="shell" type="xs:string"  substitutionGroup="val" />
</xs:schema>