xsd - 如何获取一些元素作为选择

xsd - How to get some elements as choice

我有以下xml,

<miniHome>
    <required>
        <washing_machine/>
        <vessels/>
        <refrigerator/><!--THIS SHOULD BE A CHOICE-->
        <cooler/><!--THIS SHOULD BE A CHOICE-->
    </required>
</miniHome>

在此我需要选择'refrigerator'和'cooler'。一次只能有一个。并且这两个元素不是强制性的。

这里的问题是我需要满足下面的这个要求xsd

<xs:complexType name="homeOperationType"/>
<xs:element name="homeType" type="homeOperationType" abstract="true"/>

<xs:complexType name="miniHomeType">
        <xs:complexContent>
            <xs:extension base="homeOperationType">
                <xs:all>
                    <xs:element name="AC"/>
                    <xs:element name="washing_machine"/>
                    <xs:element ref="cooler"/> <!--THIS SHOULD BE A CHOICE-->
                    <xs:element ref="refridgerator"/> <!--THIS SHOULD BE A CHOICE-->
                </xs:choice>
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
<xs:element name="miniHome" type="miniHomeType" substitutionGroup="homeType"/>

<xs:complexType name="coolerType">
    <xs:complexContent>
        <xs:extension base="xs:anyType"/>
    </xs:complexContent>
</xs:complexType>
<xs:element name="cooler" type="coolerType"/>

<xs:complexType name="configUriType">
    <xs:simpleContent>
        <xs:extension base="xs:anyURI"/>
    </xs:simpleContent>
</xs:complexType>
<xs:element name="refrigerator" type="configUriType"/>
  1. 'cooler'和'refrigerator'属于以上类型
  2. 'cooler' 和 'refrigerator' 已如上定义并在其他地方使用。

请帮忙。

你可以用substitutionGroup实现xs:all中的xs:choice。我还必须为 required 父元素添加一条规则。这是总共出来的:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="homeOperationType" />
    <xs:element name="homeType" type="homeOperationType" abstract="true"/>

    <xs:complexType name="miniHomeType">
        <xs:complexContent>
            <xs:extension base="homeOperationType">
                <xs:all>
                    <xs:element name="AC" minOccurs="0" />
                    <xs:element name="washing_machine"/>
                    <xs:element name="vessels"/>
                    <xs:element ref="coolingType" />
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="coolerType">
        <xs:complexContent>
            <xs:extension base="xs:anyType"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="configUriType">
        <xs:simpleContent>
            <xs:extension base="xs:anyURI"/>
        </xs:simpleContent>
    </xs:complexType>

    <xs:element name="coolingType" />   <!--THIS SHOULD BE A CHOICE-->
    <xs:element name="cooler"       type="coolerType" substitutionGroup="coolingType"/>
    <xs:element name="refrigerator" type="configUriType" substitutionGroup="coolingType" />

    <xs:complexType name="miniRequiredType" >
        <xs:sequence>
            <xs:element name="required" type="miniHomeType" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <xs:element name="miniHome" type="miniRequiredType" />
</xs:schema>

由于 required 元素的处理,此示例中丢失了 substitutionGroup="homeType",但您肯定可以将其重新集成到您的代码中。

编辑:合并了额外的类型定义。