XSD架构接受3个元素(严格一次)和其他两个可选元素的选择,这些元素可以按任意顺序

时间:2017-07-21 12:59:20

标签: xml xsd

我正在编写一个架构,我想定义以下结构(假设我们有类型A, B, C, D, E)。架构应该接受[A, B or C]中的一个,它必须出现并且只出现一次[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> 类元素应该对它们遵循的顺序不敏感。换句话说,接受以下示例:

<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

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

DE

然而,当根据此模式验证文档时,处理器会报告&#34; cos-nonambig&#34; ED的错误。我无法理解为什么这个模式允许进行暧昧的解释,因为它描述了三个元素之间的选择:要么以E顺序存在,要么两者都存在于D顺序中或仅存在 /** * @When I attach file */ public function iAttachFile() { $page = $this->getSession()->getPage(); $element = $page->find('xpath', "//input[@data-field-type='logo']"); $element->attachFile('full_path'); } 或仅存在{ {1}}存在。

1 个答案:

答案 0 :(得分:0)

我认为您的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>