代码之家  ›  专栏  ›  技术社区  ›  Nic Gibson

唯一粒子冲突

  •  2
  • Nic Gibson  · 技术社区  · 17 年前

    我已经研究这个问题太久了。我怀疑我遗漏了一些明显的东西,因为我太熟悉了。

    我有一个模式,它有一个独特的粒子冲突错误。我明白为什么,但我花了太长时间来摆弄它,以至于不能退后一步解决问题。

    我如何表述这个模式,以便它能够验证我需要建模的内容?

    内容模型如下所示:

    <document>
        <extract>...</extract>
        <structure>...</structure>
        <structure>...</structure>
    </document>
    

    <document>
        <structure>...</structure>
        <structure>...</structure>
    </document>
    

    <document>
        <extract>...</extract>
        <extract>...</extract>
    </document>
    

    那是一个 文件 元素可以包含一个或多个 提取液 元素或一个或多个 结构 或者它可以包含一个 提取液 元素后接一个或多个 结构 元素。

    我有一个(不正确的)模式,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
        <xs:element name="document" type="Document"/>
        <xs:complexType name="Document">
            <xs:choice>
                <xs:sequence>
                    <xs:element ref="extract" minOccurs="0"/>
                    <xs:element ref="structure" minOccurs="1" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:element maxOccurs="unbounded" ref='extract'/>
            </xs:choice>
        </xs:complexType>
    
        <xs:element name="extract" type="xs:string"/>
        <xs:element name="structure" type="xs:string"/>
    
    </xs:schema>
    

    (这是一个更复杂模式的精简版)。

    干杯

    网卡

    1 回复  |  直到 17 年前
        1
  •  3
  •   araqnid    17 年前

    因此,您需要一个DTD样式的内容模型:

    extract+|structure+|extract,structure+
    

    这里的问题是 extract 无法确定要采用哪个分支。但是我们可以这样重写内容模型:

    extract,(structure+|extract*)|structure+
    

    你可以看到,如果你像代数一样“展开”了内部选择,这也是一样的:

    extract,structure+|extract,extract*|structure+
    extract,structure+|extract+|structure+     [[ extract,extract* === extract+ ]]
    

    这个内容模型可以转换回XSD:

    <xs:complexType name="Document">
     <xs:choice>
      <xs:sequence>
       <xs:element ref="extract"/>
       <xs:choice>
        <xs:element ref="structure" maxOccurs="unbounded"/>
        <xs:element ref="extract" minOccurs="0" maxOccurs="unbounded"/>
       </xs:choice>
      </xs:sequence>
      <xs:element ref="structure" maxOccurs="unbounded"/>
     </xs:choice>
    </xs:complexType>