具有可选子元素的默认XML序列(或全部)必须至少有一个子元素吗?

时间:2017-10-25 22:06:01

标签: xml xsd xsd-validation xml-validation

如果有人能够确认以下架构的解释是否正确,我将不胜感激:

<xs:element name="Element1">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Child1" minOccurs="0" />
            <xs:element name="Child2" minOccurs="0" /> 
        </xs:sequence>
    </xs:complexType>
</xs:element>

虽然Child1Child2都是可选的,但Element1必须至少有一个孩子符合上述架构;即文件:

<Element1></Element1>    

不遵守。为使其有效,需要序列minOccurs = 0(?)

更新

当子元素是可选的时,问题涉及序列(和所有)的出现的含义。例如,文件;

<Element1>
    <Child2/>
    <Child1/>
</Element1>

符合上述架构。序列会发生两次;在第一次通过时,Child1缺席。第二,Child2缺席。但重点是,序列minOccurs(默认值为1)得到满足,因为它发生了两次。

使用上面给出的第一个例子(仅Element1;没有子元素),序列根本不会发生,并且(IMO)不满足minOccurs = 1

1 个答案:

答案 0 :(得分:2)

  

带有可选子元素的默认XML序列(或全部)必须至少有一个子元素吗?

没有...

  

虽然Child1Child2都是可选的,Element1必须有   至少有一个孩子遵守上述架构

minOccurs的默认值为1,因此您可以认为xsd:sequence被限制为出现一次。但是,只要满足其子项的出现约束一次,就会满足xsd:sequence minOccurs="1"。当所有子出现约束为minOccurs="0"时,允许一个空序列。  因此,即使没有任何<Element1/>Child1子元素,Child2也是有效的。

另见

进一步的例子:

XSD与xs:sequence minOccurs="0"

<xs:element name="r">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="1">
            <xs:element name="a"/>
            <xs:element name="b"/> 
        </xs:sequence>
    </xs:complexType>
</xs:element>

有效的XML: <r/><r><a/><b/></r>

XSD与xs:sequence minOccurs="1"(默认)

<xs:element name="r">
    <xs:complexType>
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element name="a"/>
            <xs:element name="b"/> 
        </xs:sequence>
    </xs:complexType>
</xs:element>

有效的XML: <r><a/><b/></r>

XSD与xs:sequence minOccurs="2"

<xs:element name="r">
    <xs:complexType>
        <xs:sequence minOccurs="2" maxOccurs="2">
            <xs:element name="a"/>
            <xs:element name="b"/> 
        </xs:sequence>
    </xs:complexType>
</xs:element>

有效的XML: <r><a/><b/><a/><b/></r>