按顺序和选择进行XSD验证

时间:2013-06-25 20:09:39

标签: xml validation xsd

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

我有一个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。

感谢您的建议!

3 个答案:

答案 0 :(得分:0)

  

我想要的是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

答案 1 :(得分:0)

你已经遇到了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>

答案 2 :(得分:0)

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

因为第四个元素仍然存在'独特的粒子归因'错误。

再次感谢!