首页 文章

XML-Schema:maxOccurs,minOccurs

提问于
浏览
7

当我运行我的代码时,它给了我这个错误

[ s4s-att-not-allowed: Attribute 'maxOccurs' cannot appear in element 'element'.]

这是我的架构:

<xs:element name="parameters" maxOccurs="1" minOccurs="0">
    <xs:complexType>
        <xs:all>
            <xs:element ref="p ?"/> 
        </xs:all>
    </xs:complexType>
</xs:element>

1 回答

  • 5

    <xs:element> 可以在顶级声明(低于 xs:schema ),但它不能有 minOccursmaxOccurs ,因为它不能只有一个元素,如果不是,则该信息指的是父元素的上下文 . 这是合法的:

    <xs:schema ...>
        <xs:element name="parameters">...</xs:element>
        ...
    </xs:schema>
    

    但这不是:

    <xs:schema ...>
        <xs:element name="parameters" maxOccurs="1" minOccurs="0">...</xs:element>
    ...
    </xs:schema>
    

    您可以引用组中的顶级 xs:element ,例如 xs:sequence . 在这里,您可以使用这些属性,因为现在您有一个上下文(此组中允许的上下文数量) . 这是合法的:

    <xs:schema ...>
        <xs:element name="parent">
            <xs:complexType>
                <xs:sequence>
                     <xs:element ref="parameters" maxOccurs="1" minOccurs="0" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
        <xs:element name="parameters">
            <xs:complexType>
                <xs:all>
                    <xs:element ref="p" minOccurs="0"/> 
                </xs:all>
            </xs:complexType>
        </xs:element>
        ...
    </xs:schema>
    

    这里 <parent><parameters> 出现的上下文,所以你可以说它在那里被允许了多少次 . <parameters> 的定义是全局的,您使用 ref 属性来引用它 .

    如果您永远不需要重用 parameters 或者如果您永远不会以root身份使用 parameters ,那么您不需要它在顶级并且可以将其嵌套在 parent 定义中 . 在这种情况下,您可以将 name 属性与 minOccursmaxOccurs 一起使用 .

    <xs:schema ...>
        <xs:element name="parent">
            <xs:complexType>
                <xs:sequence>
                     <xs:element name="parameters" maxOccurs="1" minOccurs="0" />
                         <xs:complexType>
                              <xs:all>
                                   <xs:element ref="p" minOccurs="0"/> 
                              </xs:all>
                         </xs:complexType>
                     </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
        ...
    </xs:schema>
    

    您还可以参考顶级类型 . 重用,扩展和限制类型更常见,因此这也是定义元素的有效(和推荐)方法:

    <xs:schema ...>
        <xs:element name="parent">
            <xs:complexType>
                <xs:sequence>
                     <xs:element name="parameters" type="ParameterType" maxOccurs="1" minOccurs="0" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
        <xs:complexType name="ParameterType">
            <xs:all>
                <xs:element ref="p" minOccurs="0"/> 
            </xs:all>
        </xs:complexType>
        ...
    </xs:schema>
    

相关问题