代码之家  ›  专栏  ›  技术社区  ›  Jataro

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

xsd
  •  2
  • Jataro  · 技术社区  · 15 年前

    考虑以下事项:

    <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的子元素、孙子等,那么它的子元素必须是子组或xgroup的一部分。如果B是它的祖先,那么它的子代必须在子组或XGroup中。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Jataro    15 年前

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

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

    不过,这似乎过于冗长。有更优雅的解决方案吗?