Xsd 为什么keyref的验证取决于关键元素的顺序?

Xsd 为什么keyref的验证取决于关键元素的顺序?,xsd,keyref,Xsd,Keyref,我的文档包含ID为的A元素和引用As的B元素,如下所示: <xs:complexType name="elementTypeWithKey'> <xs:attribute name="theKey" type="xs:string"/> </xs:complexType> 当我根据我的简单模式(见下文)进行验证时,我得到以下错误: cvc-identity-constraint.4.3: Key 'ref' with value 'x' not fo

我的文档包含ID为的A元素和引用As的B元素,如下所示:

<xs:complexType name="elementTypeWithKey'>
  <xs:attribute name="theKey" type="xs:string"/>
</xs:complexType>

当我根据我的简单模式(见下文)进行验证时,我得到以下错误:

cvc-identity-constraint.4.3: Key 'ref' with value 'x' not found for identity constraint of element 'root'.
若我将元素的顺序更改为


文档验证时没有任何错误


为什么验证结果取决于元素的顺序?

这是验证程序中的错误还是我的模式中的错误?




我用Eclipse(我认为它使用xerces)、xerces-c 3.1.1、xmlstarlet 1.5.0和libxml2.7.8进行了验证,但只有Eclipse和xerces出现了错误。

你说得对,针对标识约束的有效性不应该取决于输入中元素的顺序

在这里,我认为问题在于模式不太正确,Xerces在生成问题的有用诊断时遇到了困难。(libxml不报告错误的事实只是它对XSD的不完全覆盖的结果。)

您的键约束应该在元素的范围内定义,在该范围内键值必须是唯一的——因此在
元素上定义,而不是在
A
元素上定义。(根据定义,A.KEY约束要求每个
A
元素的字符串值在该
A
元素中是唯一的,这将始终是唯一的。id属性声明为xs:id类型的事实当然需要唯一性。同样地,
Aref
idref属性也是唯一的eclared为xs:IDREF类型意味着您的key和keyref声明实际上并没有做很多ID和IDREF尚未完成的工作。)


一旦将.KEY的声明移动到
根元素的声明中,Xerces和Saxon就同意模式是正确的,文档是有效的。

我在Eclipse中遇到了类似的问题,直到
xs:KEY
xs:keyref
都显式设置为相同的类型。在我的例子中,我将两者都设置为
xs:string
(我还使用了
xs:unique
keyref
unique
的引用,但对
key
keyref
对的作用似乎是相同的)

例如,如果键基于如下所示的元素:

<xs:complexType name="elementTypeWithKey'>
  <xs:attribute name="theKey" type="xs:string"/>
</xs:complexType>