2

有没有办法在 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 新手之一,我天真的理解是,我将无法在其他模式中重用它(重用 =将任何声明elementt_MyReusableUniqueKeysList)?

4

1 回答 1

3

不,您不能将 XSD 中的标识约束与类型相关联。在 XSD 中,与在 SQL 中一样,引用完整性不同于类型系统。

[后记]。上一段的第二句似乎需要拆包。

在 SQL 中,表中的每一列都有一个数据类型:整数、小数点左边 6 位、右边 2 位的十进制数、varchar 80、日期、长度为 8 的定长字符串等。对于每一列,表创建者还可以指定该列是否允许为NULL。每一列都可以是一个键、键的一部分、对另一个表中键的引用或此类引用的一部分。NOT NULL、PRIMARY KEY、SECONDARY KEY 和 FOREIGN KEY ... REFERENCES ... 约束都与类型系统正交:它们都不是由分配给列的类型隐含或可以隐含的,也没有其中需要特定类型。引用完整性约束在逻辑上附加到列(或列序列)而不是类型。从这个意义上说,

(请注意,我在这里关注的是 SQL 的关系核心,而忽略了多年来所做的各种添加和扩展。我不知道在 SQL 99 及更高版本中所做的各种添加是否以这种方式运行。)

类似地,在 XSD 中,身份约束(键、唯一和 keyref)与类型系统尽可能正交。XSD 类型具有(或:可以具有)名称,并且没有类型名称意味着存在或不存在任何标识约束(遗留 ID 和 IDREF 类型除外)。相反,身份约束可以用于任何类型。XSD 的标识约束附加到元素,而不是类型。SQL 模型在这里很重要,无论是从智力上还是从实现的角度来看(因为负责的 WG 中的几个主要 SQL 供应商都计划在他们的 SQL 实现中支持 XSD——事实上大多数主要的 SQL 实现现在都这样做了)。

于 2014-04-11T16:42:03.013 回答