0

私のドキュメントには、ID を持つ A 要素と、次のように As を参照する B 要素が含まれています。

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="file:\\\refissue.xsd">

    <A id="x"/>
    <A id="y"/>

    <B><Aref idref="x" /></B>   

</root>

単純なスキーマ (以下を参照) に対して検証すると、次のエラーが発生します。

cvc-identity-constraint.4.3: Key 'ref' with value 'x' not found for identity constraint of element 'root'.

A要素の順序を次のように変更すると

    <A id="y"/>
    <A id="x"/>

ドキュメントはエラーなしで検証されます。


検証結果が要素の順序に依存するのはなぜですか?

これはバリデータまたは私のスキーマのバグですか?


<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>

                <xs:element maxOccurs="unbounded" name="A">
                    <xs:complexType>
                        <xs:attribute name="id" type="xs:ID" />
                    </xs:complexType>
                    <xs:key name="A.KEY">
                        <xs:selector xpath="." />
                        <xs:field xpath="@id" />
                    </xs:key>
                </xs:element>

                <xs:element maxOccurs="unbounded" name="B">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element minOccurs="0" maxOccurs="1" name="Aref">
                                <xs:complexType>
                                    <xs:attribute name="idref" type="xs:IDREF" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

            </xs:sequence>
        </xs:complexType>

        <xs:keyref name="ref" refer="A.KEY">
            <xs:selector xpath="B/Aref" />
            <xs:field xpath="@idref" />
        </xs:keyref>

    </xs:element>
</xs:schema>

Eclipse(xercesを使用していると思います)、xerces-c 3.1.1、xmlstarlet 1.5.0、およびlibxml2 2.7.8で検証を試みましたが、Eclipseとxercesでのみエラーが発生します。

4

2 に答える 2

1

そうです、同一性制約に対する有効性は、入力内の要素の順序に依存するべきではありません。

ここでの問題は、スキーマが正しくないことであり、Xerces は問題の有用な診断を生成するのに苦労していると思います。(libxml がエラーを報告しないという事実は、XSD の不完全なカバーの結果にすぎません。)

キー制約は、キー値が一意である必要がある要素のスコープで定義する必要があります。つまり、root要素ではなく、要素で定義する必要がありAます。(定義されているように、A.KEY 制約では、各A要素の文字列値がその要素内で一意である必要がAあり、これは常に当てはまります。id 属性が xs:ID 型として宣言されているという事実には、一意性が必要です。同様に、Arefidref 属性が xs:IDREF 型として宣言されているという事実は、ID と IDREF によってまだ実行されていない、キーとキー参照の宣言が実際にはここで多くの作業を行っていないことを意味します。)

A.KEY の宣言をroot要素の宣言に移動すると、Xerces と Saxon は、スキーマが問題なく、ドキュメントが有効であることに同意します。

于 2013-09-16T19:42:08.727 に答える
0

xs:keyと のxs:keyref両方が明示的に同じタイプに設定されるまで、Eclipse で同様の問題が発生しました。私の場合、両方に設定しましたxs:string(また、とへxs:uniquekeyref参照を使用していましたが、とのペアuniqueでも同じように機能するようです)。keykeyref

たとえば、キーが次のような要素に基づいている場合:

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

theKey属性が明示的であるxs:string場合は、keyRef として使用される属性も明示的であることを確認してxs:stringください。

<xs:complexType name="elementTypeWithKeyRef">
  <xs:attribute name="theKeyRef" type="xs:string"/>
</xs:complexType> 
于 2016-10-25T17:57:00.090 に答える