Xml 序列和选择中的XSD验证

Xml 序列和选择中的XSD验证,xml,validation,xsd,Xml,Validation,Xsd,我看了很多帖子都没有找到答案 我有一个XSD来验证我的XML,我遇到了一些问题 这里是我的XSD的一部分 它工作得很好,但这并不完全是我想要做的。我想要一个更像这样的模式: <xsd:element name="Tree"> <xsd:complexType> <xsd:sequence> <xsd:group ref="Element" minOccurs="0" maxOccurs="unbound

我看了很多帖子都没有找到答案

我有一个XSD来验证我的XML,我遇到了一些问题

这里是我的XSD的一部分


它工作得很好,但这并不完全是我想要做的。我想要一个更像这样的模式:

<xsd:element name="Tree">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element ref="El3" minOccurs="0" maxOccurs="1" />
            <xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

但这种模式是错误的

我想要的是一个El1或El2的未排序列表,可选一个(并且只有一个)El3

谢谢你的建议

我想要的是一个El1或El2的未排序列表,可选一个(并且只有一个)El3

我把它读作

(e1 | e2)*(e3,(e1 | e2)*)

就是

sequence 
  choice max=unbounded
    E1
    E2
  /choice
  sequence min=0
    E3
    choice max=unbounded
      E1
      E2
    /choice
  /sequence
/sequence

您遇到了XSD的“独特粒子属性”陷阱(对应于XML DTD的“确定性”陷阱和SGML DTD的“非模糊性”陷阱)。XSD不会接受您的内容模型,因为当它遇到作为树元素的第一个子元素的元素El1的实例时,如果不进行前瞻,就无法判断它是匹配对group元素的第一个引用还是第二个引用。(不要问为什么负责任的工作组中有人认为讲这个故事很重要;这是一个乏味而令人沮丧的故事。)

因此,您需要在声明中稍作修改:

<xsd:element name="Tree">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:group ref="Element" 
                 minOccurs="0" maxOccurs="unbounded" />
      <xsd:sequence minOccurs="0" maxOccurs="1">
        <xsd:element ref="El3"/>
        <xsd:group ref="Element" 
                   minOccurs="0" maxOccurs="unbounded" />
      <xsd:sequence>
    </xsd:sequence>
</xsd:complexType>


多亏了C.M.Sperberg McQueen,我稍微修改了您的提案,在第二个序列中添加了一个选择指标:

<xsd:element name="Tree">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
      <xsd:choice minOccurs="0">
         <xsd:sequence minOccurs="0">
           <xsd:element ref="El3"/>
           <xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
           <xsd:element ref="El4" minOccurs="0"/>
         </xsd:sequence>
         <xsd:element ref="El4"/>
      </xsd:choice> 
    </xsd:sequence>
</xsd:complexType>

因为第四个元素仍然存在“独特粒子属性”错误


再次感谢

抱歉,无法复制该结果。一旦新xsd:choice元素上的maxOccurs=“0”被更正为minOccurs=“0”(假设您并不真正想要minOccurs=“1”和maxOccurs=“0”,这就是您现在所拥有的),此声明中就没有错误。当然,正如您所注意到的,您必须在choice指示符中更改maxOccurs by minOccurs。谢谢你的评论,这篇文章已经编辑过了。
<xsd:element name="Tree">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
      <xsd:choice minOccurs="0">
         <xsd:sequence minOccurs="0">
           <xsd:element ref="El3"/>
           <xsd:group ref="Element" minOccurs="0" maxOccurs="unbounded" />
           <xsd:element ref="El4" minOccurs="0"/>
         </xsd:sequence>
         <xsd:element ref="El4"/>
      </xsd:choice> 
    </xsd:sequence>
</xsd:complexType>