使用一些验证程序时,以下xsd在验证xml文件时会出现一些问题,这些文件似乎是有效的。依赖于验证器,错误消息看起来像这样(libxml):
Schemas validity error : Element 'referringElement': No match found for key-sequence ['1'] of keyref 'reference'. Start location: 8:0
错误消息令人困惑,因为似乎已定义引用的键(id = 1)。
这是导致问题的xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="document">
<xs:complexType>
<xs:sequence>
<xs:element ref="listOfReferencedElements"/>
<xs:element ref="referringElement"/>
</xs:sequence>
</xs:complexType>
<xs:keyref name="reference" refer="id">
<xs:selector xpath=".//*"/>
<xs:field xpath="@reference"/>
</xs:keyref>
</xs:element>
<xs:element name="listOfReferencedElements">
<xs:complexType>
<xs:sequence>
<xs:element name="referencedElement" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:key name="id">
<xs:selector xpath="./referencedElement"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
<xs:element name="referringElement">
<xs:complexType>
<xs:attribute name="reference" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
...这是一个示例xml导致上面的错误消息:
<?xml version="1.0" encoding="UTF-8"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:/C:/Users/jakob/dev/projects/integration/trading-contracts/trunk/playground/Reference.xsd">
<listOfReferencedElements>
<referencedElement id="1"/>
<referencedElement id="2"/>
</listOfReferencedElements>
<referringElement reference="1"/>
</document>
答案 0 :(得分:1)
问题似乎是密钥的类型与引用的类型不兼容。 以下列方式修改引用元素(将类型定义为xs:string)解决了问题:
<xs:element name="referringElement">
<xs:complexType>
<xs:attribute name="reference" type="xs:string"/>
</xs:complexType>
</xs:element>