XSD 2个元素一次,1个元素1+任意顺序

时间:2018-05-06 15:18:01

标签: xml xsd xsd-validation complextype

我正在开发一个包含3个元素的XML Schema,这些元素可以任意顺序

  • 其中两个必须出现一次
  • 第三个元素可以一次多次
  • 这三个都是必需的。

在下面的示例中,每个bio都有一个favoriteColor和一个favoriteNumber,以及至少一个comment。我希望他们能以任何顺序被允许(包括交替)。

<xs:element name="bio">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="favoriteColor" maxOccurs="1" minOccurs="1"/>
            <xs:element name="favoriteNumber" maxOccurs="1" minOccurs="1"/>
            <xs:element name="comment" maxOccurs="unbounded" minOccurs="1"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

一旦可能,选项为<xs:choice>,但它只允许其中一个选项。将每个可能的订单组合列为替代序列似乎很笨拙:(abc,acb,bac,bca,cab,cba)......并且它仍然没有考虑到在其他两个之间散布评论的可能性。 (例如&#34;评论,号码,评论,颜色,评论,评论&#34;应该被允许)

<xs:all>可以正常工作,但它只允许每个最多1个实例。我需要允许多个&#34;评论&#34; s。我可以将<xs:element name="comment" maxOccurs="unbounded" minOccurs="0"/>放在&#34; all&#34;的上方和下方标签,但这不起作用。见下文:

<xs:element name="bio">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0"/>
            <xs:all> <!-- not allowed here -->
                <xs:element ref="favoriteColor" maxOccurs="1" minOccurs="1"/>
                <xs:element ref="favoriteNumber" maxOccurs="1" minOccurs="1"/>
                <xs:element ref="comment" maxOccurs="1" minOccurs="1"/>
            </xs:all>
            <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

有什么建议吗?这个板上有很多问题与模式中元素的顺序有关,但是我找不到任何能解决我想要做的事情(我只有一次&#34;只有一次& #34;和#34;至少一次)。&#34;

1 个答案:

答案 0 :(得分:1)

我认为不可能。甚至

<xs:sequence>
     <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0" /> 
     <xs:element ref="comment" maxOccurs="unbounded" minOccurs="0" />
</xs:sequence> 

会给你错误。 (cos-nonambig:&#34;测试&#34;:评论和&#34;测试&#34;:评论(或来自其替换组的元素)违反&#34;独特粒子归因&#34;。在对此进行验证期间架构,将为这两个粒子创建歧义。)