【问题标题】:Unique Particle Violations独特的粒子违规
【发布时间】:2009-04-16 21:04:08
【问题描述】:

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

我有一个遭受独特粒子违规错误的架构。我明白为什么,但我花了太长时间摆弄它,无法退后一步解决问题。

如何表达此架构,以便它可以验证我需要建模的内容?

内容模型类似于:

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

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

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

这是一个 document 元素,可以包含一个或多个 extract 元素或一个或多个 structure 元素,也可以包含单个 提取元素,后跟一个或多个结构元素。

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

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

(这是一个更复杂的架构的精简版)。

干杯

尼克

【问题讨论】:

    标签: xml schema xsd


    【解决方案1】:

    所以你需要一个 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>
    

    【讨论】:

    • 就是这样 - 我知道我已经看这个太久了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多