使用keyref的XSD架构验证错误

时间:2013-09-18 14:21:25

标签: xml xsd

使用一些验证程序时,以下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>

1 个答案:

答案 0 :(得分:1)

问题似乎是密钥的类型与引用的类型不兼容。 以下列方式修改引用元素(将类型定义为xs:string)解决了问题:

<xs:element name="referringElement">
    <xs:complexType>
        <xs:attribute name="reference" type="xs:string"/>
    </xs:complexType>
</xs:element>