XSD:我可以让一个元素继承祖先的规则吗?

时间:2009-06-20 02:52:32

标签: xsd

请考虑以下事项:

<xs:complexType name="A">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="subAGroup"/>
        <xs:group ref="xGroup"/>
    </xs:choice>
</xs:complexType>
<xs:complexType name="B">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="subBGroup"/>
        <xs:group ref="xGroup"/>
    </xs:choice>
</xs:complexType>

我想要发生的是,如果xGroup中的一个元素是A的子元素,孙子元素等,那么它的子元素必须是subAGroup或xGroup的一部分。如果B是它的祖先,那么它的子节点必须在subBGroup或xGroup中。

1 个答案:

答案 0 :(得分:0)

一种解决方案是为每种父类型创建不同的组和类型。按照上面的例子,它将成为:

<xs:complexType name="A">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="subAGroup"/>
        <xs:group ref="xGroup"/>
    </xs:choice>
</xs:complexType>
<xs:complexType name="B">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="subBGroup"/>
        <xs:group ref="yGroup"/>
    </xs:choice>
</xs:complexType>

<xs:group name="xGroup">
    <xs:choice>
        <xs:element name="Element1" type="AEleType"/>
    </xs:choice>
</xs:group>
<xs:complexType name="AEleType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="subAGroup"/>
        <xs:group ref="xGroup"/>
    </xs:choice>
</xs:complexType>

<xs:group name="yGroup">
    <xs:choice>
        <xs:element name="Element1" type="BEleType"/>
    </xs:choice>
</xs:group>
<xs:complexType name="BEleType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:group ref="subBGroup"/>
        <xs:group ref="yGroup"/>
    </xs:choice>
</xs:complexType>

虽然看起来过于冗长。有更优雅的解决方案吗?