我正在编写一个架构,我想定义以下结构(假设我们有类型A, B, C, D, E
)。架构应该接受[A, B or C]
中的一个,它必须出现并且只出现一次[D or E]
中的一个,它可能出现在单个或两个中,或者两个都不出现,但每个都不超过一次。 ABC
和DE
类都有<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}}存在。
答案 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>