至少有一个 XML 元素在 XSD 中没有重复
At least one XML element with no duplicates in XSD
我正在尝试创建一个验证场景,我想从列表中选择至少一个非重复元素。
沿线的某处:
<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 表示“而不必硬编码所有可能的序列”(但请参阅 大大减少了组合)。可以使用 xsd:unique
强制元素的值是唯一的,但是 xsd:unique
使用的 XPath 子集不包括 name()
,否则可以帮助对元素的名称进行唯一性声明元素。
XSD 1.1 解
您的限制可以在 XSD 1.1 中使用 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>
你不说元素序列是否有意义。对于您的申请,
<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>
我正在尝试创建一个验证场景,我想从列表中选择至少一个非重复元素。
沿线的某处:
<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 表示“而不必硬编码所有可能的序列”(但请参阅 xsd:unique
强制元素的值是唯一的,但是 xsd:unique
使用的 XPath 子集不包括 name()
,否则可以帮助对元素的名称进行唯一性声明元素。
XSD 1.1 解
您的限制可以在 XSD 1.1 中使用 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>
你不说元素序列是否有意义。对于您的申请,
<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>