同一性制約 (IDC) はグローバル要素宣言にて定義されます。同一性制約によりノードの一意性が指定され、ユニークなノード間の正確な参照を行うことができます。
同一性制約 (unique、key、keyref) を定義するために以下のメカニズムを使用することができます:
•スキーマ概要に表示されたグローバル要素にて同一性制約を宣言することができます。グローバル要素を選択し、属性/アサーション/同一性制約 (AAIDC) ペインにある同一性制約タブをクリックします (以下のスクリーンショットを参照)。

同一性制約タブにある挿入または追加アイコンにより、同一性制約 (unique、key、keyref) を追加します。選択された同一性制約に対して field を追加することもできます。選択された field や同一性制約を削除するには、削除アイコンを使用してください。
•グローバル要素のコンテンツモデルビュー では、グローバル要素やローカルの子孫要素にて同一性制約を定義することができます。このビューでは、同一性制約のタブと図の中に表示された要素の制約ボックスで同一性制約を編集することができます (以下のスクリーンショットでは、match 要素に team セレクターが含まれるというユニークな制約が示されています)。「スキーマ設計 | 表示設定」 により表示されるスキーマ表示設定にて、またはスキーマ設計ツールバーにある 「制約を図に表示」 アイコンをクリックすることで、表示方法を切り替えることができます。図に示された同一性制約に対してドラッグ アンド ドロップ編集機能を使用することもできます。

同一性制約 (unique、key、keyref) を図の中に追加するには、制約を行う要素を右クリックして、コンテキスト メニューから 「子の追加 | <同一性制約の種類>」 を選択してください。同一性制約が図の中で選択されていると、フィールド アイテムが選択可能になります。「Delete」 キーを押下することで、選択された field または同一性制約を削除することができます。
以下にあるいずれかの方法で、selector ならびに field ボックスに XPath 条件式を入力することができます: (i) キーボードから入力する、(ii) selector または field ボックスをクリックすると表示されるドロップダウン リストから目的のノードを選択する、または (iii) ターゲットノードを selector または field ボックスへドラッグして、ボックスがハイライトされたところでドロップする (XPath 条件式が自動的に作成されます)。
| メモ: | コンポーネント入力ヘルパーにある同一性制約のタブではスキーマ内にあるすべての同一性制約の概要 を確認することができます。詳細については、以下のコンポーネント入力ヘルパーを参照ください。 |
|
制約を図に表示: コンテンツ モデル ビューが表示されている際にスキーマ設計ツールバーで有効になります。同一性制約の表示を図または同一性制約タブで行うか指定します。 |
|
同一性制約の視覚化: ココンテンツ モデル ビューにて選択可能になります。同一性制約の情報の表示/非表示を切り替えます。 |
|
セレクター ノード、フィールド ノード: ノードの図にて表示され、これら 2 つのアイコンにより、selector ならびに field の XPath 条件式により選択されたノードがそれぞれ表示されます。 |
同一性制約の可視化アイコン
が有効になっている場合、同一性制約の情報が図の中で可視化されます。可視化が有効になっている場合、selector と field の XPath 条件式により選択されたノードがボックス内のアイコンにより示され、緑色の線によりセレクターとフィールドのボックスが接続されます (上のスクリーンショットを参照ください)。
同一性制約の可視化アイコンにより、スキーマ ビューにおける同一性制約の検証機能も切り替えられます。XPath 条件式または同一性制約が間違っている場合、エラーが赤色で、警告がオレンジ色で示されます。XML スキーマ ドキュメントの検証を行うと、エラーと警告がメッセージ ウィンドウに表示されます。
同一性制約の可視化アイコン
を無効にすることで、検証を無効にすることができます。
このセクションの下部に示される同一性制約の例は、以下の妥当なインスタンス ドキュメントをベースにしています:
<results xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Scores.xsd">
<!----- Groups ----->
<group id="A">
<team name="Brazil"/>
<team name="Germany"/>
<team name="Italy"/>
<team name="Holland"/>
</group>
<group id="B">
<team name="Argentina"/>
<team name="France"/>
<team name="England"/>
<team name="Spain"/>
</group>
<!----- matches ----->
<match group="A" date="2012-06-12" location="Munich">
<team name="Brazil" for="2" points="3"/>
<team name="Germany" for="1" points="0"/>
</match>
<match group="A" date="2012-06-12" location="Frankfurt">
<team name="Italy" for="2" points="1"/>
<team name="Holland" for="2" points="1"/>
</match>
<match group="B" date="2012-06-13" location="Munich">
<team name="Argentina" for="2" points="3"/>
<team name="France" for="0" points="0"/>
</match>
<match group="B" date="2012-06-13" location="Berlin">
<team name="England" for="0" points="1"/>
<team name="Spain" for="0" points="1"/>
</match>
</results>
ユニーク制約により、要素または属性 (要素や属性のセット) の値が定義されたスコープ内でユニーク (一意) でなければならないと指定されます。なんらかのリーグ戦を表している上の XML テキストでは、同じ名前のチーム同士が試合を行わないような制約が必要となるため、各 match 要素のスコープにて team/@name ノードの値がユニークであるような制約を作成します。以下の操作により制約を作成します:
1.スキーマ概要にて match 要素を選択します。match 要素が同一性制約のスコープとなります。
2.同一性制約タブの左上にある 「追加」 または 「挿入」 アイコンをクリックして、メニューから 「ユニーク」 をクリックします。ユニーク制約の行が追加されます (以下のスクリーンショットを参照)。

3.同一性制約の名前を入力します (上のスクリーンショットでは、MatchTeams という名前が与えられています)。
4.team 要素を選択する XPath 条件式を Selector 列に入力します。match 要素がコンテキスト ノードだということに注意してください。これで team 要素が同一性制約のセレクターとなり、ユニーク制約が適用されるノードとなります。
5.ユニークでなければならない @name ノードを Field 列に入力します。ユニーク制約が入力されたノードの値に対して適用されます。
上記のユニーク制約により、各 match 要素のスコープ内にてすべての team 要素にユニークな @name 属性値が必要になります。
更にフィールドを追加して、ユニーク制約をチェックすることもできます。例えば result 要素にて定義されたユニーク制約により、ユニークな日付と場所の組み合わせがすべての match に含まれていることをチェックすることができます (同じ日付に同じ場所で複数の試合を行うことができなくなります)。ユニーク制約により、各 match 要素 (セレクター) に対して @date と @location の値を組み合わせた値が result 要素のスコープ内部でユニークとなる必要があります。
上記の方法により result 要素に対してユニーク制約を定義します。match がセレクターとなり、@date と @location がフィールドとなります (以下のスクリーンショットを参照)。追加アイコンをクリックして 「フィールド」 を選択することで、2 番目のフィールドが追加されます。

| メモ: | 同一性制約タブの Refer 列はキー参照 (keyref) 制約でのみ有効になります。 |
キー制約により、以下の制約が指定されます: (i) 要素や属性 (または属性やスキーマのセット) の値が定義されたスコープ内でユニークであり、(ii) これらフィールド要素や属性がインスタンス XML ドキュメントに含まれている (従って省略可能な要素や属性をキー制約のフィールドとして選択すべきではありません)。キー制約により、ユニーク制約により与えられる制約に加え、指定されたフィールド要素/属性を XML ドキュメント内に含める必要があります。
既に登場した最初のユニーク制約と同様に、match 要素にて定義されたキー制約を以下のスクリーンショットに示します:

このキー制約により、各 match 要素のスコープ内部ですべての team 要素にユニークな @name 値が必要になります。更に、@name 属性が match/team 要素上に存在しなければならないとも指定されます。
| メモ: | 同一性制約タブの Refer 列はキー参照 (keyref) 制約でのみ有効になります。 |
キー参照により、インスタンス ドキュメント内にある値のセットがチェックされます。例えば上に示される XML のテキストでは、キー参照を使うことにより同じグループに含まれているチーム同士で試合が行われるかをチェックすることができます。条件が満たされない場合、XML ドキュメントの検証に失敗します。
最初にユニーク制約またはキー制約を作成します。以下のスクリーンショットでは TeamInGroups という名前のユニーク制約が results 要素に対して作成されています。この制約により、group 要素内にある各 team にて、ユニークな @name 属性値が必要になります。

次に、match の子要素である team を選択し、@name の属性値が TeamInGroups により返された値に含まれるかどうかをチェックする、TeamCheck という名前のキー参照 (keyref) を作成します。
以下のスクリーンショットでは、(水色でハイライトされている) このキー参照と、詳細入力ヘルパーの内容が示されています。選択された同一性制約との関係は緑色の実線で示されており、選択されていない同一性制約は緑色の破線により示されています。ぞれぞれの同一性制約にて selector と field の XPath 条件式にて選択されたノードが、それぞれ
と
アイコンにより示されます。ノードが縮退されると、関係を表す線が破線状態で表示されます。

XML スキーマ ドキュメントで宣言されたデフォルト名前空間は、その XML スキーマ ドキュメントのデフォルト名前空間です。スキーマ ドキュメント内の接頭辞のない要素名に対して適用されますが、スキーマ ドキュメント内の接頭辞のない XPath 条件式に対しては適用されません。
XSD 1.1 にて新たに追加された xpathDefaultNamespace 属性 ( XSD 1.1 の新規機能) は、XPath 条件式にて接頭辞のない要素の名前空間を指定するために使用されます。XPath デフォルト名前空間は、それらが宣言された XML スキーマ要素上でスコープされます。xpathDefaultNamespace 属性は、以下の XML Schema 1.1 要素内に記述することができます:
•xs:schema
•xs:assert と xs:assertion
•xs:alternative
•xs:selector と xs:field (同一性制約にて)
XSD 1.1 モードでは、xs:schema 上の xpathDefaultNamespace がスキーマ設定ダイアログ (「スキーマ設計 | スキーマ設定」) にてセットされます。上に示されるその他の要素の場合、xpathDefaultNamespace 属性が詳細入力ヘルパーにてセットされます (以下のスクリーンショットを参照)。xs:schema 上で XPath デフォルト名前空間を宣言することで、スキーマ全体に対する XPath デフォルト名前空間が宣言されます。この宣言は、xpathDefaultNamespace 属性が許されている属性でオーバーライドすることができます (上のリストを参照ください)。

Xs:schema 上で XPath デフォルト名前空間を宣言することで、スキーマ全体に対する XPath デフォルト名前空間が宣言されます。この宣言は、xpathDefaultNamespace 属性が許されている属性でオーバーライドすることができます (上のリストを参照ください)。
実際の名前空間を含める代わりに xpathDefaultNamespace 属性には、以下のうちのどれかを含めることができます:
•##targetNamespace: スキーマのターゲット名前空間と同じ名前空間が XPath デフォルト名前空間として使用されます。
•##defaultNamespace: スキーマの名前空間と同じ名前空間が XPath デフォルト名前空間として使用されます。
•##local: XPath デフォルト名前空間は指定されません。
ドキュメントに対して XPath デフォルト名前空間が宣言されなかった場合、XPath 条件式における接頭辞なしの要素は名前空間を持たない要素として扱われます。
| メモ: | XPath デフォルト名前空間宣言は属性に対して適用されません。 |
同一性制約とそのセレクター、フィールドに対して ID を与えることができます。ID を割り当てるには必要なコンポーネントを選択し、詳細入力ヘルパーの ID 行にて ID を入力してください。
同一性制約タブのツールバーにある 「並べ替え」 アイコンをクリックすることで、同一性制約の並べ替えを行うことができます。コンポーネントの並べ替えダイアログでは、選択されたコンポーネントとその兄弟、または選択されたコンポーネントのセットを並べ替えの対象とすることができます。「Shift」 キーを押下しながらクリックすることで範囲の選択を、「Ctrl」 キーを押下しながらクリックすることで新たなコンポーネントを選択対象に含めることができます。

並べ替えの範囲を選択した後には、すべての対象をアルファベット順で並べ替えるのか (種類の前に名前)、または同一性制約の種類ごと (ユニーク制約、キー制約、キー参照の順) でアルファベット順に並べ替えるのかを選択することができます。
並べ替えの順序はスキーマのテキストに反映されます。