xs:unique要求值唯一但允许字段缺失或为空,xs:key要求值唯一且必须存在,xs:keyref要求字段值必须引用xs:key或xs:unique定义的合法值。

三者都用于定义XML文档中值的唯一性或引用关系,但语义和校验规则不同:
xs:unique 要求值唯一,但允许为空或缺失
它指定某元素或属性在所选范围内必须互不相同,但如果该字段没出现、值为空字符串或全由空白字符组成,就跳过校验——不报错。适合用在“可选但一旦出现就必须唯一”的场景。
- 例如:一个product元素可带sku属性,有则不能重复,没有也不强制
- 必须配合xs:selector和xs:field使用,先选一组元素,再指定其中哪个字段要唯一
xs:key 要求值唯一且必须存在
结构和xs:unique几乎一样,但更严格:对应字段不仅得唯一,还必须在每个匹配元素中显式出现、非空、非空白。相当于“主键”语义。
- 例如:每个user元素必须有id属性,且所有id值全局不重复
- 常作为xs:keyref的目标,提供被引用的“键集合”
xs:keyref 用于建立跨元素的引用一致性
它本身不定义唯一性,而是声明某个字段的值必须出现在另一个xs:key或xs:unique定义的值集合中。作用是保证“引用有效”。
- 例如:order里的customer_id必须等于某个customer元素的id
- 必须通过ref属性指向一个已定义的xs:key或xs:unique
- 引用字段可以是任意类型(字符串、数字等),不限于ID类型
简单说:unique管“不重复但可缺”,key管“不重复且必填”,keyref管“引用必须落在前两者定义的合法值里”。










