3

我如何强制选择至少一个,但不重复?

以下语法允许任何 c 元素最多重复 3 次。

<choice minOccurs="1" maxOccurs="3">
    <element name="c1" type="string" />
    <element name="c2" type="string" />             
    <element name="c3" type="string" />
</choice>

谢谢

史蒂夫

4

1 回答 1

3

松开maxOccurs="3",你得到的是“至少选择一个”,不再重复。

对于粒子,默认值为minOccurs="1"; 一个强制性的选择,每个选项粒子本身都是强制性的,是你的答案。

更新:根据您的评论,如果您正在寻找您所描述的粒子的任何有序组合,那么这是您可以通过 XSD 规范获得的最佳效果。

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="root">
        <xsd:complexType>
            <xsd:choice>
                <xsd:sequence>
                    <xsd:element ref="c1"/>
                    <xsd:element ref="c2" minOccurs="0"/>
                    <xsd:element ref="c3" minOccurs="0"/>
                </xsd:sequence>
                <xsd:sequence>
                    <xsd:element ref="c2"/>
                    <xsd:element ref="c3" minOccurs="0"/>
                </xsd:sequence>
                <xsd:element ref="c3"/>
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="c1" type="xsd:string"/>
    <xsd:element name="c2" type="xsd:string"/>
    <xsd:element name="c3" type="xsd:string"/>
</xsd:schema>

这已经很乱了;如果您正在寻找更多数量的粒子或任何无序组合,那么我会将模型更改为类似的东西(这些是 XSD 1.0 的限制 - 这一切都与您可以使用的 XPath 语法中的限制有关选择器/字段)。

<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="c" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:key name="pk">
            <xsd:selector xpath="*"/>
            <xsd:field xpath="@code"/>
        </xsd:key> 
    </xsd:element>
    <xsd:element name="c" type="TC" abstract="true"/>   
    <xsd:element name="c1" type="TC1" substitutionGroup="c"/>
    <xsd:element name="c2" type="TC2" substitutionGroup="c"/>
    <xsd:element name="c3" type="TC3" substitutionGroup="c"/>

    <xsd:complexType name="TC">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="code" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <xsd:complexType name="TC1">
        <xsd:simpleContent>
            <xsd:restriction base="TC">
                <xsd:attribute name="code" type="xsd:string" fixed="c1"/>
            </xsd:restriction>
        </xsd:simpleContent>
    </xsd:complexType>
    <xsd:complexType name="TC2">
        <xsd:simpleContent>
            <xsd:restriction base="TC">
                <xsd:attribute name="code" type="xsd:string" fixed="c2"/>
            </xsd:restriction>
        </xsd:simpleContent>
    </xsd:complexType>
    <xsd:complexType name="TC3">
        <xsd:simpleContent>
            <xsd:restriction base="TC">
                <xsd:attribute name="code" type="xsd:string" fixed="c3"/>
            </xsd:restriction>
        </xsd:simpleContent>
    </xsd:complexType>  
</xsd:schema>

示例 XML 如下所示:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <c1 code="c1">c11</c1>
    <c2 code="c2">c21</c2>
    <c3 code="c3">c21</c3>
</root>

或这个:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd">
    <c2 code="c2">c21</c2>
    <c1 code="c1">c11</c1>
</root>

基本上,您正在键入一些使您的元素独一无二的组件,它是数据的一部分,而不是标签名称。再次,凌乱,但作为一个练习,它可能会给你一个想法。

于 2012-04-27T21:12:44.683 回答