XML Schema:为什么不能有孩子?这怎么可以绕过?

我正在尝试为< property>创建一个模式元素必须具有< key>子元素,< val>< shell>中的一个或< perl>和可选的< os>或<条件>,并且子元素的顺序并不重要。

以下是有效< 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&gt ;.有人可以解释为什么吗? 更重要的是,有人可以提供一种方法来验证这样的<属性>元件?

我可以把三个元素 – < val>< perl>和<壳> – 作为< xs:all>中的可选元素,但是我希望模式验证该元素中只有一个存在于该元素中。这可以做吗

我认为这是一个更好的,因为“选择”现在是自己的元素(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>

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念