0

以下の XML スニペットを使用すると、質問を簡単に説明できます。

<Hosts>
  <Host Ip1="1.2.3.4" Ip2="1.2.3.5" />
  <Host Ip1="1.2.3.6" Ip2="1.2.3.4" />
  ...
<Hosts>

Ip1 および Ip2 属性のすべてのインスタンスの値が一意であることを XSD で検証する方法はありますか? たとえば、上記の 2 番目の要素は、その Ip2 値が最初の要素の Ip1 値と重複しているため、検証に失敗します。

ありがとう!パイハン

4

1 に答える 1

0

制約はこのxsd:unique種の機能を提供することを目的としていますが、考えている特定の制約をどのように表現するかを理解するのを難しくするアドホックな方法で制約されています。(つまり、あなたが考えている制約を表現することは可能かもしれませんが、私には方法がわかりません。)

これを読んでいる他の人の利益のために、問題を詳しく説明する価値があるかもしれません。制約の明確な定式化は次のようになります。

<!--* Not conformant *-->
<xs:unique name="hostip">
  <xs:selector xpath="Host/@Ip1 | Host/@Ip2"/>
  <xs:field xpath="."/>
</xs:unique>

ただし、セレクターを制御するアドホックな制約によって属性軸が許可されていないため、これは準拠した一意性制約ではありません。(これらの制約は、バリデーターがドキュメント全体をメモリに保持する必要がないようにするため、および人々が必要と考えるケースをカバーするために定義されました。明らかに、属性ノード値の一意性をチェックする必要があるとは誰も考えていなかったので、XPath のサブセットが定義されました。 XSD 1.0 の設計者が要素と属性を同様の立場に置こうと試みた長さを考えると、これは顕著な設計エラーのように見えます。)

一部の読者には、別の定式化が考えられる場合があります。つまり、次のとおりです。

<xs:selector xpath="Host"/>
<xs:field xpath="@Ip1|@Ip2"/>

どのセレクターでも、各フィールド式は多くても 1 つの値を返さなければならないため、これも不適合です。

XML を次の形式に再構成できる場合

<Hosts>
  <Host>
    <Ip>1.2.3.4</Ip>
    <Ip>1.2.3.5</Ip>
  <Host>
  <Host>
    <Ip>1.2.3.6</Ip>
    <Ip>1.2.3.4</Ip>
  <Host>
  ...
</Hosts> 

xs:uniqueの要素宣言に次の要素を追加することで、念頭に置いている一意性制約を適用できますHosts

<xs:unique name="hostip">
  <xs:selector xpath="Host/Ip"/>
  <xs:field xpath="."/>
</xs:unique>

IP 値として 1.2.3.4 の重複にフラグを立てるという望ましい効果があります。

于 2012-10-12T16:41:40.537 に答える