繁体   English   中英

XSD验证的顺序和选择

[英]XSD validation in a sequence and choice

我看了很多帖子却找不到答案...

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

这是我的XSD(的一部分)

<xsd:group name="Element">
    <xsd:sequence>
        <xsd:choice>
            <xsd:element ref="El1" />
            <xsd:element ref="El2" />
        </xsd:choice>
    </xsd:sequence>
</xsd:group>

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

它工作正常,但这并不是我想要做的全部。 我想要一个更像这样的模式:

<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的实例作为Tree元素的第一个子元素时,如果不先行就无法知道它是否与对组Element的第一个引用相匹配或与第二个元素相匹配。 (不要问为什么负责任的工作组中的任何人都认为这很重要;这是一个乏味而令人沮丧的故事。)

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

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

多亏了CM 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>

因为我还有第四个元素的“唯一粒子归因”错误。

再次感谢 !

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM