2

我有以下 XML 架构

<xsd:complexType name="SimpleThing">
    <xsd:choice maxOccurs="unbounded">
        <xsd:group ref="simpleContent" />
    </xsd:choice>
</xsd:complexType>

<xsd:complexType name="ExtendedThing">
    <xsd:complexContent>
        <xsd:extension base="SimpleThing">
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="qux" />
            </xsd:choice>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:group name="simpleContent">
    <xsd:choice>
        <xsd:element name="foo" />
        <xsd:element name="bar" />
    </xsd:choice>
</xsd:group>

<xsd:group name="extendedContent">
    <xsd:choice>
        <xsd:group ref="simpleContent" />
        <xsd:element name="qux" />
    </xsd:choice>
</xsd:group>

<xsd:element name="root" type="ExtendedThing" />

我希望类型ExtendedThing包含foo,bar并且qux以任意顺序。但是对于这个模式,qux必须紧随其后foobar因为从超类型的选择和子类型的选择中创建了一个序列,而不是选择的联合。

另一种方法,将类型定义替换ExtendedThing

<xsd:complexType name="ExtendedThing">
    <xsd:complexContent>
        <xsd:extension base="SimpleThing">
            <xsd:group ref="extendedContent" />
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

也不起作用,因为违反了唯一粒子归属约束。

有没有解决这个问题的方法,或者不可能在 XML Schema 中创建一个类型,它是另一种类型的扩展,这样新类型的内容是一组元素(以任何顺序),它是内容的超集超类型的?

4

1 回答 1

2

由于实际原因,这是不可能的。超类型的内容模型必须始终完整地出现在子类型的内容模型之前。它有助于保持验证器的快速实施。

于 2010-11-19T16:20:54.730 回答