2014-04-10 58 views
2

有没有在XML Schema 1.0 xs:complexType而不是xs:element中添加唯一约束的方法?我特指的是我想创建一个唯一的键列表类型,我可以在模式的许多地方轻松地重用。类型中的XML模式唯一约束而不是元素

像这样的事情将是巨大的:

<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模式新手,我的天真理解是,我将无法重用它,然后在其他模式(重用=宣布任何elementt_MyReusableUniqueKeysList)?

+0

如果我理解了最后一部分正确,您可以重用您的元素。你可以声明一个像这样的元素:' – lokimidgard

回答

3

不,您不能将XSD中的身份约束与类型相关联。在XSD中,与SQL中一样,参照完整性与类型系统不同。

[后记]。前段第二句似乎需要拆封。

在SQL中,表中的每一列都获取一个数据类型:整数,小数点左边有6位数的小数点,右边有两个数字,varchar 80,日期,长度为8的固定长度字符串等。对于每一列,表创建者还可以指定该列是否允许为NULL。每列可以是键,键的一部分,对另一个表中的键的引用,或者是这种引用的一部分。 NOT NULL,PRIMARY KEY,SECONDARY KEY和FOREIGN KEY ... REFERENCES ...约束都是与类型系统正交的:它们中没有一个是被分配给列的类型所暗示的,或者可以暗示的,并且没有他们需要特定的类型。参照完整性约束逻辑上附于列(或列的序列)而不是类型。从这个意义上讲,SQL的引用完整性约束与类型系统不同。 (注意,我将重点放在SQL的关系核心上,忽略了多年来所做的各种添加和扩展,我不知道在SQL 99及更高版本中所做的各种添加是否以这种方式表现出来)。同样,在XSD中,身份约束(key,unique和keyref)与类型系统是正交的,因为它有可能使其成为可能。 XSD类型具有(或:可以具有)名称,并且没有类型名称意味着存在或不存在任何身份约束(除了传统ID和IDREF类型)。相反,身份约束可以用于任何类型。 XSD的身份约束被附加到元素,而不是类型。 SQL的模型在智能和实施方面都很重要(因为负责工作组中的几个主要SQL供应商计划在他们的SQL实现中支持XSD--实际上现在大多数SQL实现都是这样做的)。

+0

好的,谢谢你的回答,但是你能否详细阐述一下“参照完整性与类型系统不同”的部分?恐怕我不明白这意味着什么。 –