0

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

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

谢谢你的建议 !

4

3 回答 3

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
于 2013-06-25T22:57:00.693 回答
0

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

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

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

于 2013-06-25T23:00:22.457 回答
0

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

因为我仍然有第四个元素的“独特粒子属性”错误。

再次感谢 !

于 2013-06-26T12:40:50.357 回答