【问题标题】:Must a default XML Sequence (or All) with optional child elements have at least one child?具有可选子元素的默认 XML 序列(或全部)必须至少有一个子元素吗?
【发布时间】:2018-04-07 03:43:57
【问题描述】:

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

<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

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

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

    没有……

    虽然Child1Child2 都是可选的,但Element1 必须具有 至少有一个孩子符合上述模式

    minOccurs 的默认值为1,因此您可以正确假设xsd:sequence 被限制出现一次。但是,xsd:sequence minOccurs="1" 只要满足其子项的出现约束一次,就可以满足。当所有子出现约束为minOccurs="0" 时,允许一个空序列。 因此,&lt;Element1/&gt; 是有效的,即使没有任何 Child1Child2 子元素。

    另请参阅


    更多示例:

    带有xs:sequence minOccurs="0"的XSD

    <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: &lt;r/&gt;&lt;r&gt;&lt;a/&gt;&lt;b/&gt;&lt;/r&gt;

    带有xs:sequence minOccurs="1" 的XSD(默认)

    <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: &lt;r&gt;&lt;a/&gt;&lt;b/&gt;&lt;/r&gt;

    带有xs:sequence minOccurs="2"的XSD

    <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: &lt;r&gt;&lt;a/&gt;&lt;b/&gt;&lt;a/&gt;&lt;b/&gt;&lt;/r&gt;

    【讨论】:

    • 感谢您的耐心等待。如果满足条件满足序列出现,并且序列的出现计数表示满足其条件的次数,我想问一下 minOccurs = 0 的序列的行为将如何解释。由于现在这是与上述不同的查询,我应该将其作为一个单独的问题提出吗?
    • @CAnder:答案已更新,在xs:sequence 上添加了minOccurs 的更多示例。
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2022-01-21
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多