xs:unique用于定义xml元素内字段值的唯一性约束,由name、xs:selector和xs:field三部分组成,作用域限于所在元素,允许字段为空,区别于要求非空的xs:key。

xs:unique 用于在 XML 文档中为某个元素(或其子元素)定义唯一性约束,确保指定字段在整个作用域内不重复。它必须写在 xs:element 或 xs:complexType 的 xs:key / xs:unique / xs:keyref 容器中(通常放在 xs:annotation 后、xs:complexType 前),且只对当前元素及其后代生效。
基本结构:怎么写一个 xs:unique
一个典型的 xs:unique 包含三部分:name(唯一标识名)、xs:selector(选中要检查的元素范围)、xs:field(指定哪个值需唯一)。
-
name必须是合法的 NCName(不能含空格、数字开头等),同一作用域内不能重名 -
xs:selector的xpath表达式必须匹配到零个或多个元素(通常用相对路径,如.//book或book) -
xs:field的xpath是相对于selector匹配结果的,只能取原子值(如属性、文本节点),不支持复杂表达式
常见写法示例:按属性或子元素值唯一
假设有一个 library 元素,包含多个 book,要求每本书的 isbn 属性或 title 子元素不能重复:
<xs:element name="library"> <xs:complexType> <xs:sequence> <xs:element name="book" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> </xs:sequence> <xs:attribute name="isbn" type="xs:string"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <!-- 唯一性约束:isbn 属性值全局唯一 --> <xs:unique name="isbnUniq"> <xs:selector xpath="book"/> <xs:field xpath="@isbn"/> </xs:unique> <!-- 唯一性约束:title 文本内容唯一 --> <xs:unique name="titleUniq"> <xs:selector xpath="book"/> <xs:field xpath="title"/> </xs:unique> </xs:element>
注意作用域和 XPath 限制
xs:unique 的作用域就是它所在的元素(这里是 library),不会跨父元素生效。XPath 在这里受限较多:
- 不支持函数(如
normalize-space()、concat()) - 不支持轴步(如
parent::、following-sibling::) - 只能用
@attr、child::element、.(文本)这类简单路径 - 如果
field匹配不到值(如title为空或不存在),该条记录会被忽略(不报错,也不参与去重)
和 xs:key、xs:keyref 的区别
xs:unique 和 xs:key 结构完全一样,唯一区别是:xs:key 要求 field 值必须存在且非空,而 xs:unique 允许为空或缺失(跳过校验)。xs:keyref 则用于引用另一个 key 或 unique 的值,实现外键约束。
所以如果你只要“不重复”,不强求每个都填,就用 xs:unique;如果必须填且不能重复(比如主键),就该用 xs:key。
基本上就这些。写的时候注意 name 唯一、xpath 简单、作用域清晰,就能稳稳生效。