XML Schema中的属性/元素共现约束

Max*_*sky 8 xml schema xsd

是否可以创建一个XML Schema,它对属性/元素对强加共生约束?

<primitive-list>
    <primitive name="P1">
        <definition><!-- primitive specification --></definition>
    </primitive>
    <primitive name="P2">
        <definition><!-- primitive specification --></definition>
    </primitive>

    <!-- other common primitives are specified here-->

<primitive-list>

<composite-list>
    <composite name="C1">
        <primitive ref="P1" />
        <primitive ref="P2" />
        <primitive>
            <definition><!-- inline primitive specification --></definition>
        </primitive>        
    </composite>

    <!-- Other compisites are specified here-->

</composite-list>
Run Code Online (Sandbox Code Playgroud)

架构应该意味着:

  • 如果原始的一个内部指定的元素原始列表元素,那么它应该包含名称属性和嵌入式定义元素,但不是裁判属性.
  • 如果在复合元素中指定了原始元素,那么它应该包含ref属性或definition元素.两种情况都不允许使用该名称.

我很确定它是可能的,因为XML Schema中的元素元素本身就像那样.所以任何拥有这种神圣知识的人请分享:-)

先感谢您.

Max*_*sky 9

在互联网上搜索并挖掘了一些书后,我想出了如何实现它.

首先,我们需要定义一个泛型类型,它适应两种原始元素的所有属性和元素.假设定义元素在其他地方定义.

<xs:complexType name="primitive" abstract="true">
    <xs:sequence>
        <xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:Name" />
    <xs:attribute name="ref" type="xs:Name" />
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

然后我们定义两个原始子类型分别用于原始列表复合.

<xs:complexType name="public-primitive">
    <xs:complexContent>
        <xs:restriction base="primitive">
            <xs:sequence>
                <xs:element ref="definition" minOccurs="1" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="name" type="xs:Name" use="required" />
            <xs:attribute name="ref" use="prohibited" />
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="private-primitive">
    <xs:complexContent>
        <xs:restriction base="primitive">
            <xs:sequence>
                <xs:element ref="definition" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
            <xs:attribute name="name" use="prohibited" />
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

现在我们可以根据这些复杂类型定义基本列表复合元素,如下所示:

<xs:element name="primitive-list">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="primitive" type="public-primitive" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="composite">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="primitive" type="private-primitive" maxOccurs="unbounded">
                <xs:key name="definition-ref--co-occurrence--constraint">
                    <xs:selector xpath="." />
                    <xs:field xpath="definition|@ref" />
                </xs:key>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

我们来看看原始架构要求,看看它们是如何实施的:

  • 如果原始的一个内部指定的元素原始列表元素,那么它应该包含名称属性和嵌入式定义元素,但不是裁判属性.

仅通过public-primitive类型的定义来强制执行此要求.

  • 如果在复合元素中指定了原始元素,那么它应该包含ref属性或definition元素.两种情况都不允许使用该名称.

这一要求是由定义强迫私人原语类型和由所述键:XS在指定元素的原始的内定义的元素的复合元件.该XS:关键担保,要么裁判定义是存在的,但不能同时使用.