XSD选择序列

时间:2015-04-18 18:21:21

标签: xml xsd jaxp

我希望元素<aaa>包含元素序列<bbb>或两个元素序列<bbb>,<ccc>。例如,以下内容有效:

<aaa>
  <bbb>
  <bbb>
</aaa>

<aaa>
  <bbb>
  <ccc>
  <bbb>
  <ccc>
</aaa>

但以下内容无效:

<aaa>
  <bbb>
  <ccc>
  <bbb>
</aaa>

我尝试过以下方案

<xs:complexType name="aaa">
  <xs:choice minOccurs="0">
        <xs:sequence  minOccurs="0" maxOccurs="15">             
            <xs:element name="bbb" type="xxx" /> 
            <xs:element name="ccc" type="xxx"/>
        </xs:sequence> 
        <xs:sequence  minOccurs="0" maxOccurs="15">
            <xs:element name="bbb" type="xxx" />
        </xs:sequence>
  </xs:choice>
</xs:complexType>

但是在使用JAXP验证时出现此错误消息:cos-nonambig: bbb and bbb (or elements from their substitution group) violate "Unique Particle Attribution"有没有办法可以获得我的目标?提前致谢

1 个答案:

答案 0 :(得分:3)

我认为如果您使用XSD 1.1(现在无法对其进行测试),则不会出现错误。编辑:感谢user Michael Kay在XSD中对此进行评论1.1模式仍然必须明确,因此(与我的想法不同)在XSD 1.1中仍会出现唯一粒子归因错误。

无论如何,你可以像下面的例子那样做。使用此功能,您可以说 aaa 元素的内容始终以 bbb 元素开头,后面跟着

a)从0到无穷大 bbb 元素

b) ccc 元素和optionaly n 次序 bbb,ccc

<xs:element name="aaa">
    <xs:complexType>
        <xs:sequence minOccurs="0">
            <xs:element name="bbb" type="xxx" />
            <xs:choice>
                <xs:element name="bbb" type="xxx" minOccurs="0" maxOccurs="unbounded" />
                <xs:sequence>
                    <xs:element name="ccc" type="xxx" />
                    <xs:sequence minOccurs="0" maxOccurs="unbounded">
                        <xs:element name="bbb" type="xxx" />
                        <xs:element name="ccc" type="xxx" />
                    </xs:sequence>
                </xs:sequence>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
</xs:element>