0

对于某些验证器,以下 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>
4

1 回答 1

1

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

<xs:element name="referringElement">
    <xs:complexType>
        <xs:attribute name="reference" type="xs:string"/>
    </xs:complexType>
</xs:element>
于 2013-09-18T14:21:24.840 回答