XML Schema创建PK和FK时PkReportsTo无法解析错误如何解决?
错误产生原因
- 命名空间匹配问题:你的XSD声明了默认命名空间
http://www.ricardoterra.com.br且开启了elementFormDefault="qualified",所有业务元素都属于该命名空间,但标识约束中的XPath选择器没有绑定该命名空间,导致PkReportsTo约束实际未匹配到任何节点,解析器无法识别该约束组件。 - 外键逻辑颠倒:业务逻辑上应为
employee的reportsTo字段(存储上级员工编号)引用employee的number主键,你当前的定义反过来要求员工编号引用reportsTo的值,完全不符合外键设计逻辑。同时reportsTo设置了minOccurs="0"为可选字段,不符合xs:key要求所有选中节点值非空的规则,本身就不能作为主键使用。 - 约束引用未加命名空间前缀:所有自定义的标识约束都属于你声明的默认命名空间,
refer属性直接写PkReportsTo会被识别为无命名空间的约束,自然无法匹配到你定义的约束。
修复步骤
- 给自定义命名空间添加别名,方便XPath中引用,修改xs:schema标签如下:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.ricardoterra.com.br" xmlns="http://www.ricardoterra.com.br" elementFormDefault="qualified">
- 删除错误的
PkReportsTo主键定义,该字段为可选字段不能作为主键使用。 - 修正所有标识约束的XPath选择器,添加命名空间前缀
tns:,同时修正keyref的关联逻辑,让reportsTo引用员工主键PkEmploye:
<!-- 原有唯一约束修正 --> <xs:unique name="number"> <xs:selector xpath="tns:employee"></xs:selector> <xs:field xpath="@number"></xs:field> </xs:unique> <!-- 原有员工主键修正 --> <xs:key name="PkEmploye"> <xs:selector xpath="tns:employee"/> <xs:field xpath="@number"></xs:field> </xs:key> <!-- 修正后的外键约束 --> <xs:keyref name="FKtoReportsToEmployee" refer="tns:PkEmploye"> <xs:selector xpath="tns:employee"></xs:selector> <xs:field xpath="tns:reportsTo"></xs:field> </xs:keyref>
修复后即可正常通过XSD校验,外键会自动验证所有非空的reportsTo值都存在于已有的员工number属性中。
内容的提问来源于stack exchange,提问作者Paulo Alcantara
相关产品推荐
相关产品推荐

