我尝试为包含不同类型条目的选择定义复杂类型 但只允许一个条目具有“multiselect”属性。
以下是我的尝试:
<element name="selection" minOccurs="0" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="name" type="string" />
<element name="source">
<complexType>
<choice>
<element name="item" minOccurs="1" maxOccurs="unbounded" type="string" />
<element name="path" type="string" minOccurs="1" maxOccurs="1" />
</choice>
</complexType>
</element>
</sequence>
<attribute name="multiselection" type="boolean" minOccurs="1" maxOccurs="1" />
</complexType>
</element>
结果应该是可以有更多的“选择”元素,如果源是“item”类型或“path”类型则无关紧要。但是只允许其中一个“selection”元素具有属性multiselection = true。
但似乎没有属性的min- / maxOccures。 我该如何解决这个问题?
Thx
答案 0 :(得分:3)
首先,min / maxOccurs保留给粒子(局部元素,元素引用,组引用,序列,选择)。属性出现由
控制use = (optional | prohibited | required) - 默认值为可选
为了进一步限制在一组元素中,只有一个元素可能具有指定的逻辑值为true的属性(1或文字true
) - 这是单独使用XSD 1.0时无法做到的事情。您可以在XSD之上使用Schematron。
或者,您可以在XSD 1.1中轻松实现此目的。
<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="sample">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="selection" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="source">
<xsd:complexType>
<xsd:choice>
<xsd:element name="item" minOccurs="1" maxOccurs="unbounded" type="xsd:string"/>
<xsd:element name="path" type="xsd:string" minOccurs="1" maxOccurs="1"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="multiselection" type="xsd:boolean" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:assert test="count(selection[@multiselection=true()])=1"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
这些行中的某些内容(均为false或两者都为true)将无法通过验证:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) -->
<sample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<selection multiselection="false">
<name>name1</name>
<source>
<item>item1</item>
<item>item1</item>
</source>
</selection>
<selection multiselection="false">
<name>name1</name>
<source>
<item>item1</item>
<item>item1</item>
</source>
</selection>
</sample>
cvc-assertion.3.13.4.1: Assertion evaluation ('count(selection[@multiselection=true()])=1') for element 'sample' with type '#anonymous' did not succeed.
使其中一个true
应该成功验证。