如何在xsd中将元素定义为强制/可选和任何顺序

时间:2014-11-20 15:36:03

标签: xml xsd

我无法使用<xsd:all>为以下要求定义元素​​

我收到的错误是maxOccursv should be 0 or 1 under schema全部。

以下是我的要求,有人可以尽快帮助我。

  1. 元素(A&amp; B)可以在xml中以任何顺序出现(所以我使用xsd:all,但是gettting错误),我不想顺序
  2. 元素A是必需的,它应始终显示在xml中,但元素B是可选的。
  3. 元素A&amp; B可以出现任意次,例如我可以将元素A提取10次,将元素B提取20次。

  4. <?xml version="1.0" encoding="utf-8"?>
    <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="InvoiceData">
            <xsd:complexType>
                <xsd:all>
                    <xsd:element name="A" minOccurs="1" maxOccurs="unbounded" >
                    <xsd:element name="B" minOccurs="0" maxOccurs="unbounded" >
                </xsd:all>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    

3 个答案:

答案 0 :(得分:1)

在XSD 1.1中,你可以使用xs:all,其maxOccurs值不是0或1。

在XSD 1.0中,你可以得到的最近的是模型(A | B)*,但是你不能为A和B强加不同的maxOccurs值。

答案 1 :(得分:1)

凯博士说,你不能在XSD 1.0中使用<xsd:all>来解决这个问题。相反,您需要修改您的答案以使用序列和选择。

此XSD 1.0代码应符合您的三个要求:订单是免费的,<A>是强制性的,最大出现次数都是无限制的。

<xsd:element name="InvoiceData" >
    <xsd:complexType>
        <xsd:choice>
            <xsd:sequence>
                <xsd:element name="B" minOccurs="0"/>
                <xsd:element name="A"/>
            </xsd:sequence>
            <xsd:choice minOccurs="0" maxOccurs="unbounded">
                <xsd:element name="A"/>
                <xsd:element name="B"/>
            </xsd:choice>
        </xsd:choice>
    </xsd:complexType>
</xsd:element>

答案 2 :(得分:0)

如果我正确理解了这个问题,你想要混合A和B元素; A必须至少出现一次,B根本不需要出现;没有最大值。 (如果Michael Kay认为你确实想要对A和B强加最大出现次数是对的,那么情况会变得更复杂。)

在DTD表示法中,(a*, (b, a*)+)可以解决问题。在XSD表示法中:

<xsd:sequence>
  <xsd:element ref="A" 
               minOccurs="0" 
               maxOccurs="unbounded"/>
  <xsd:sequence maxOccurs="unbounded">
    <xsd:element ref="B"/> 
    <xsd:element ref="A" 
                 minOccurs="0" 
                 maxOccur="unbounded"/>
  </
</