我正在尝试创建一个验证方案,我想从列表中选择至少一个非重复元素。
某些地方:
<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实现,而无需对所有可能的序列进行硬编码吗?如果是这样的话?
答案 0 :(得分:4)
我不相信您的约束可以在XSD 1.0“中表示,而不必硬编码所有可能的序列”(但请参阅C. M. Sperberg-McQueen's clever solution,相当于减少组合数据)。使用xsd:unique
可以强制元素的值是唯一的,但xsd:unique
使用的XPath子集不包括name()
,否则可以帮助创建关于名称的唯一性声明元件。
您的约束可以使用xs:assert
:
<?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>
答案 1 :(得分:2)
你不能说元素的顺序是否带有意义。对于您的应用程序,
<Monday/>
<Thursday/>
与
的含义相同或不同之处<Thursday/>
<Monday/>
?如果它意味着同样的事情,那么就没有必要允许两种形式,你可以得到你想要的
<xs:complexType>
<xs:sequence>
<xs:element name="Sunday" minOccurs="0"/>
<xs:element name="Monday" minOccurs="0"/>
<xs:element name="Tuesday" minOccurs="0"/>
<xs:element name="Wednesday" minOccurs="0"/>
<xs:element name="Thursday" minOccurs="0"/>
<xs:element name="Friday" minOccurs="0"/>
<xs:element name="Saturday" minOccurs="0"/>
</xs:choice>
</xs:complexType>
[附录]。哎呀;忽略了至少选择一个元素的要求。显而易见的XSD 1.0解决方案有点笨重,但确实需要至少一个,并允许最多七个元素,都是不同的。它使用从星期日,星期一开始的序列中的七向选择......
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="Sunday"/>
<xs:element name="Monday" minOccurs="0"/>
<xs:element name="Tuesday" minOccurs="0"/>
<xs:element name="Wednesday" minOccurs="0"/>
<xs:element name="Thursday" minOccurs="0"/>
<xs:element name="Friday" minOccurs="0"/>
<xs:element name="Saturday" minOccurs="0"/>
<xs:sequence>
<xs:sequence>
<xs:element name="Monday"/>
<xs:element name="Tuesday" minOccurs="0"/>
<xs:element name="Wednesday" minOccurs="0"/>
<xs:element name="Thursday" minOccurs="0"/>
<xs:element name="Friday" minOccurs="0"/>
<xs:element name="Saturday" minOccurs="0"/>
<xs:sequence>
<xs:sequence>
<xs:element name="Tuesday"/>
<xs:element name="Wednesday" minOccurs="0"/>
<xs:element name="Thursday" minOccurs="0"/>
<xs:element name="Friday" minOccurs="0"/>
<xs:element name="Saturday" minOccurs="0"/>
<xs:sequence>
<xs:sequence>
<xs:element name="Wednesday" />
<xs:element name="Thursday" minOccurs="0"/>
<xs:element name="Friday" minOccurs="0"/>
<xs:element name="Saturday" minOccurs="0"/>
<xs:sequence>
<xs:sequence>
<xs:element name="Thursday"/>
<xs:element name="Friday" minOccurs="0"/>
<xs:element name="Saturday" minOccurs="0"/>
<xs:sequence>
<xs:sequence>
<xs:element name="Friday" />
<xs:element name="Saturday" minOccurs="0"/>
<xs:sequence>
<xs:sequence>
<xs:element name="Saturday" />
<xs:sequence>
</xs:choice>
</xs:complexType>