【问题标题】:xsd - How to get some elements as choicexsd - 如何获得一些元素作为选择
【发布时间】:2019-05-16 17:35:54
【问题描述】:

我有下面的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' 已经如上定义并在其他地方使用。

请帮忙。

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    您可以通过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" 丢失了,但您当然可以将其重新集成到您的代码中。

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

    【讨论】:

    • 感谢您的回答,这是我发布的问题的确切答案。当我与实际需求进行比较时,我可以看到,
    • 1. “冷却器”的类型为
    • 并且“冰箱”的类型为
    • 2. 'cooler' 和 'refrigerator' 已经定义
    猜你喜欢
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多