0

私は答えを探してSOを検索し、応答を見つけましたが、解決策がうまくいかないようです。以下は私のxmlと私のスキーマです。アイデアは非常に単純です。2 つの本が同じ isbn を共有することはできませんが、2 つの本の isbn が等しい場合、Eclipse はエラーをスローしません。

ns プレフィックスは uk です。

<library>
    <book>
        <isbn>
            1
        </isbn>
        <title>
        Bernard Williams:  A Biography
        </title>
    </book>
    <book>
        <isbn>
            1
        </isbn>
        <title>
        Principles of Microbiopsychonomics 
        </title>
    </book>
</library>

<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="library">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="book" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="isbn" type="xs:integer"/>
                                    <xs:element name="title" />
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            <xs:unique name="uniquebook">
                <xs:selector xpath="uk:library/uk:book"/>
                <xs:field xpath="isbn"/>
            </xs:unique>
            </xs:element>               
        </xs:sequence>
    </xs:complexType>
</xs:element>

4

1 に答える 1

2

あなたは近くにいます。しかし、ここで片付けなければならないことが 2 つあります。

まず、一意性を適用するスコープに一意性制約を設定し、それをコンテキスト ノードとして使用するセレクター式を記述します。(あなたが示すコードでは、一意性制約はlibrary要素の宣言にあり、セレクター 'uk:library/uk:book' は何も選択しません。ドキュメント内で ISBN を一意にするか、または特定のライブラリ内でのみ一意にしたい. 前者の場合、宣言を uk:root の宣言に移動し、後者の場合、セレクター パスから最初のステップを削除します。)

次に、名前空間のストーリーをクリーンアップします。関連する名前空間宣言が表示されていないため、推測しています

  • スキーマ ドキュメントでは、プレフィックスukはスキーマのターゲット名前空間にバインドされます。
  • XML インスタンスでは、その名前空間がデフォルトの名前空間です。

そうでない場合は、それらをケースにするか、名前空間に関する他のストーリーに従い、一貫して従う必要があります。

現在、最大の矛盾は、2 つの XPath 式で、要素uk:libraryと要素uk:bookが名前空間で修飾され、要素isbnが名前空間で修飾されないと想定していることです。あなたが示すスキーマの部分は、両方が当てはまるわけではないことを示すのに十分です。スキーマ ドキュメントelementFormDefault="qualified"がその xs:schema 要素で指定している場合uk:はフィールド パスに追加する必要があります。または指定しているelementFormDefault="unqualified"(または属性をまったく指定していない) 場合は、名前空間のプレフィックスをから削除する必要があります。セレクタパス。

本当に必要libraryでありbook、名前空間で修飾され、修飾されていない場合は、それらの少なくとも 1 つで属性isbnを使用する必要があります。form

于 2013-06-03T18:28:15.430 に答える