【问题标题】:XML-Schema : maxOccurs , minOccursXML-Schema : maxOccurs , minOccurs
【发布时间】:2014-04-17 03:14:28
【问题描述】:

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

[ 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>

【问题讨论】:

  • 这不是您的完整架构。对于minOccursmaxOccurs,上下文很重要。它们与一个组有关。您的xs:element 是在什么情况下定义的?您可以声明 top-level 元素,但它们不能有 maxOccurs 或 minOccurs,因为它们不在上下文中。编辑您的问题并粘贴完整的上下文(从架构的根目录)。
  • 同样p ? 作为ref 的值无效。如果你的意思是one or none,你可以使用&lt;xs:element ref="p" minOccurs="0" maxOccurs="1"/&gt;(你可以省略maxOccurs="1",因为它是默认的)
  • 这里要记住的是,每个 XML 文档都可以“只有一个根元素”,这就是为什么您基本上不能为根指定最大值和最小值的原因——它隐含的 max+max 为 1 ,因此它甚至不允许您指定任何内容。

标签: xml xsd


【解决方案1】:

&lt;xs:element&gt; 可以在顶层声明(低于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>

这里&lt;parent&gt;&lt;parameters&gt; 出现的上下文,所以你可以说它在那里允许出现多少次。 &lt;parameters&gt; 的定义是全局的,您可以使用 ref 属性来引用它。

如果您永远不需要重用parameters,或者如果您永远不会将parameters 作为root,您不需要它在顶层并且可以将它嵌套在您的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>

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 2013-09-09
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多