【问题标题】:XSD schema accepting choice of 3 elements (strictly one time) and other two optional elements which may follow in any orderXSD 模式接受 3 个元素的选择(严格来说是一次)和其他两个可选元素,它们可以以任何顺序跟随
【发布时间】:2017-07-21 12:59:20
【问题描述】:

我正在编写一个模式,我想定义以下结构(假设我们有类型A, B, C, D, E)。模式应该接受[A, B or C] 之一,它必须出现并且只出现1 次+ [D or E] 之一,它可能出现一个或两个或两者都不出现,但每次不超过一次。 ABCDE 类的元素都应该对它们遵循的顺序不敏感。换句话说,接受以下示例:

<root>
    <el_A/>
</root>

<root>
    <el_B/>
    <el_E/>
    <el_D/>
</root>

<root>
    <el_C/>
    <el_D/>
</root>

以下是架构不应接受的几个示例:

<root>
    <el_A/>
    <el_B/>
    <el_E/>
    <el_D/>
</root> 

<root>
    <el_C/>
    <el_D/>
    <el_D/>
</root> 

我为 root 定义的类型如下所示:

<xs:complexType>
    <xs:sequence>
        <xs:choice minOccurs="1" maxOccurs="1">
            <xs:element name="el_A" type="tns:A"/>
            <xs:element name="el_B" type="tns:B"/>
            <xs:element name="el_C" type="tns:C"/>
        </xs:choise>
        <xs:choice minOccurs="0">
            <xs:sequence>
                <xs:element name="el_D" type="tns:D" minOccurs="1" maxOccurs="1"/>
                <xs:element name="el_E" type="tns:E" minOccurs="1" maxOccurs="1"/>
            </xs:sequence>
            <xs:sequence>
                <xs:element name="el_E" type="tns:E" minOccurs="1" maxOccurs="1"/>
                <xs:element name="el_D" type="tns:D" minOccurs="1" maxOccurs="1"/>
            </xs:sequence>
            <xs:element name="el_E" type="tns:E"/>
            <xs:element name="el_D" type="tns:D"/>
        </xs:choise>
    </xs:sequence>
</xs:complexType>   

但是,当针对此架构验证文档时,处理器会报告 el_D 的“cos-nonambig”错误。我不明白为什么这个模式允许模棱两可的解释,因为它描述了三个元素之间的选择:要么都以DE 顺序存在,要么都以ED 顺序存在,要么只存在E,要么只存在D

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    我认为您的 xsd 可以简化。我附上了以下变体:

        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="1" maxOccurs="1">
                    <xs:element name="el_A" type="tns:A"/>
                    <xs:element name="el_B" type="tns:B"/>
                    <xs:element name="el_C" type="tns:C"/>
                </xs:choice>
                <xsd:group ref="el_E_el_D"/>
            </xs:sequence>
        </xs:complexType>
      <xs:group name="el_E_el_D">
        <xs:all>
          <xs:element name="el_D" type="tns:D" minOccurs="0" maxOccurs="1"/>
          <xs:element name="el_E" type="tns:E" minOccurs="0" maxOccurs="1"/>
        </xs:all>
      </xs:group>
    

    【讨论】:

    • 这不会接受我的第二个例子,因为序列指定了元素应该出现的顺序。
    • 是的,这是真的。它没有涵盖 E 和 D 可以以任何顺序出现的情况,所以我已经解决了这个问题。我认为在您的情况下,使用 group element 定义一组要在复杂类型定义中使用的元素会很有用。我已经编辑了附加的方案。
    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多