我正在尝试创建一个验证场景,我想从列表中选择至少一个非重复元素.
在某些地方:
<xs:choice minOccurs="1" maxOccurs="7"> <xs:element name="Sunday"/> <xs:element name="Monday"/> <xs:element name="Tuesday"/> <xs:element name="Wednesday"/> <xs:element name="Thursday"/> <xs:element name="Friday"/> <xs:element name="Saturday"/> </xs:choice>
但是,上述解决方案允许重复元素出现在列表中,这是我不想要的.
有效XML的示例:
<Monday/> <Tuesday/> <Friday/>
无效XML的示例:
<Monday/> <Monday/>
这可以通过XSD实现,而无需对所有可能的序列进行硬编码吗?如果是这样的话?
解决方法
XSD 1.0解决方案
我不相信你的约束可以在XSD 1.0中表示,而不必硬编码所有可能的序列“(但是参见C. M. Sperberg-McQueen’s clever solution显着减少了组合学).使用xsd:unique可以强制元素的值是唯一的,但xsd:unique使用的XPath的子集不包括name(),否则可以帮助创建关于元素名称的唯一性声明.
XSD 1.1解决方案
您的约束可以使用xs:assert在XSD 1.1中表示:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" vc:minVersion="1.1"> <xs:element name="Days"> <xs:complexType> <xs:choice minOccurs="1" maxOccurs="7"> <xs:element name="Sunday"/> <xs:element name="Monday"/> <xs:element name="Tuesday"/> <xs:element name="Wednesday"/> <xs:element name="Thursday"/> <xs:element name="Friday"/> <xs:element name="Saturday"/> </xs:choice> <xs:assert test="count(*[name() = following-sibling::*/name()]) = 0"/> </xs:complexType> </xs:element> </xs:schema>