有没有办法在XML Schema 1.0 xs:complexType
而不是xs:element
中添加唯一约束?我的意思是我想创建一个唯一的键列表类型,我可以在架构的许多地方轻松地重用它。
这样的事情会很棒:
<xs:complexType name="t_MyReusableUniqueKeysList">
<xs:sequence>
<xs:element name="GenericElementOfTheList" type="t_GenericElementOfTheList" minOccurs="1" maxOccurs="unbounded"/>
<xs:unique name="uniqueCheck">
<xs:selector xpath="GenericElementOfTheList"/>
<xs:field xpath="GenericElementOfTheList_Key"/>
</xs:unique>
</xs:sequence>
</xs:complexType>
但它似乎不正确。
编辑/解释:我意识到我可以使用xs:element
包含上面的代码以使其工作,但我作为XML Schema新手之一的天真理解是我将无法重用然后在其他Schema中(reuse =声明任何element
为t_MyReusableUniqueKeysList
)?
答案 0 :(得分:3)
不,您无法将XSD中的身份约束与类型相关联。在XSD中,与SQL一样,参照完整性与类型系统不同。
[后记]。前一段的第二句似乎需要拆包。
在SQL中,表中的每一列都有一个数据类型:整数,小数点左边有6位数的十进制数,右边有两位数,varchar 80,日期,长度为8的固定长度字符串等。对于每一列,表创建者还可以指定是否允许该列为NULL。并且每列可以是键,键的一部分,对另一个表中的键的引用,或者这种引用的一部分。 NOT NULL,PRIMARY KEY,SECONDARY KEY和FOREIGN KEY ... REFERENCES ...约束都与类型系统正交:它们中没有一个是由分配给列的类型暗示或暗示的,并且没有他们需要特定的类型。参照完整性约束在逻辑上附加到列(或列的序列)而不是类型。从这个意义上讲,SQL的引用完整性约束与类型系统不同。
(请注意,我在这里专注于SQL的关系核心,忽略了多年来所做的各种添加和扩展。我不知道SQL 99及其后的各种添加是否表现得这样。)< / p>
类似地,在XSD中,身份约束(密钥,唯一和keyref)与可以制作它们的类型系统正交。 XSD类型具有(或:可以具有)名称,并且类型名称不表示存在或不存在任何标识约束(旧标识和IDREF类型除外)。相反,身份约束可以用于任何类型。 XSD的标识约束附加到元素,而不是类型。 SQL的模型在这里非常重要,无论是从理论上还是从实现的角度来看(因为负责的WG中的几个主要SQL供应商计划在他们的SQL实现中支持XSD - 事实上现在大多数主要的SQL实现都在这样做。)