XSD:限制substitutionGroup

时间:2017-06-29 01:09:59

标签: xsd schema

似乎应该可以将替换组限制为该组中的单个元素。然而,由于在验证期间处理替换组和元素,直觉仅适用于某些基数。

例如,以下架构无效:

<xs:element name="representedOrganization" type="Organization"/>
<xs:element name="scopingOrganization" type="Organization" substitutionGroup="representedOrganization"/>

<xs:complexType name="Test.Parent">
    <xs:sequence>
        <xs:element ref="representedOrganization" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Test.Child">
    <xs:complexContent>
        <xs:restriction base="Test.Parent">
            <xs:sequence>
                <xs:element name="scopingOrganization" type="Organization" minOccurs="0" maxOccurs="1"/>
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

但是,限制的基数(即minOccurs)的微小变化是有效的:

<xs:element name="representedOrganization" type="Organization"/>
<xs:element name="scopingOrganization" type="Organization" substitutionGroup="representedOrganization"/>

<xs:complexType name="Test.Parent">
    <xs:sequence>
        <xs:element ref="representedOrganization" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Test.Child">
    <xs:complexContent>
        <xs:restriction base="Test.Parent">
            <xs:sequence>
                <xs:element name="scopingOrganization" type="Organization" minOccurs="1" maxOccurs="1"/>
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

这不直观......但为什么?

1 个答案:

答案 0 :(得分:0)

这是两个地方处理之间的恶性互动。

  1. Schema Component Constraint: Particle Valid (Restriction)下,规范阐明:
      

    2.1任何顶级元素声明粒子(在R或B中),它是一个或多个其他元素声明的{替换组从属关系},其替换组·包含至少一个除自身之外的元素声明被视为如果它是一个选择组,其{min>}和{max occurrence}是粒子的那些,并且其{粒子}由一个粒子组成,其中{min>}和{max occurrence}为1的每个声明·替代组·。

  2. Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup)下,规范阐明:
      

    对于元素声明粒子是组粒子(所有,选择或序列)的有效限制,对应于B的品种的组粒子,{min出现}和{max出现}为1并且{particle}由与元素声明相同的单个粒子组成,必须是粒子衍生OK(All:All,Sequence:Sequence - Recurse)(§3.9.6),粒子定义的组的有效限制。推导确定(选择:选择 - RecurseLax)(§3.9.6)或粒子推导确定(全部:全部,序列:序列 - 递归)(§3.9.6),具体取决于该组是全部,选择还是序列

  3. 这会产生一种不正常的情况,其中无效的模式(上面)被转换为以下内容:

    <xs:complexType name="Test.Parent">
        <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="1">
                <xs:element name="representedOrganization" type="Organization.Organization" minOccurs="1" maxOccurs="1"/>
                <xs:element name="scopingOrganization" type="Organization.Organization" minOccurs="1" maxOccurs="1"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="Test.Child">
        <xs:complexContent>
            <xs:restriction base="Test.Parent">
                <xs:sequence>
                    <xs:choice minOccurs="1" maxOccurs="1">
                        <xs:element name="scopingOrganization" type="Organization.Organization" minOccurs="0" maxOccurs="1"/>
                    </xs:choice>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    

    此架构通过Particle Derivation OK (Choice:Choice -- RecurseLax)中的选择级基数检查。但是,它没有通过(嵌套)粒子的测试,因为受限制项的基数大于基类型中匹配粒子的基数。

    注意:解析器可能会在Particle Derivation OK (Elt:All/Choice/Sequence -- RecurseAsIfGroup)中将此报告为问题。这是包含将元素视为选项并运行嵌套选择测试的说明的部分。例如,XMLSpy报告:

      

    rcase-RecurseAsIfGroup:&lt; element name =“scopingOrganization”minOccurs =“0”&gt;不是模型组粒子的有效限制&lt; element ref =“representOrganization”minOccurs =“0”&gt ;.

    如果您可以控制派生架构,则可以通过将元素包装在一个选项中并将基数移动到此级别来克服此问题。