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 に答える