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

时间:2019-05-16 17:35:55

标签: xml xsd xsd-validation

我在xml下面,

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

在这种情况下,我需要选择“冰箱”和“冷却器”。一次只能出现一个。而且这两个元素不是强制性的。

这里的问题是我需要在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. “冷却器”和“冰箱”属于上述类型。
  2. 'cooler'和'refrigerator'已经如上定义,并已在其他地方使用。

请帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用xs:choicexs:all中实现substitutionGroup。我还必须为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>

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

编辑:合并了其他类型定义。