【问题标题】:XSD: Restricting a substitutionGroupXSD:限制替代组
【发布时间】:2017-06-29 09:23:16
【问题描述】:

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

例如,以下架构无效:

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

这并不直观......但是为什么呢?

【问题讨论】:

    标签: xsd schema


    【解决方案1】:

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

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

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

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

      对于一个元素声明粒子,它是一个群粒子(所有、选择或序列)的有效限制,一个对应于 B 的各种群粒子,其中 {min 出现} 和 {max 出现} 为 1,并且{particles} 由与元素声明相同的单个粒子组成,必须是由粒子推导 OK (All:All,Sequence:Sequence -- Recurse) (§3.9.6), Particle 定义的组的有效限制Derivation OK (Choice:Choice -- RecurseLax) (§3.9.6) 或 Particle Derivation OK (All:All,Sequence:Sequence -- Recurse) (§3.9.6),取决于组是 all、choice 还是 sequence .

    这造成了无效架构(上图)被转换为以下内容的反常情况:

    <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: 不是模型组粒子 的有效限制。

    如果您可以控制派生模式,则可以通过将元素包装在选项中并将基数移动到此级别来解决此问题。

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 2020-01-07
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多