2

私は(基本的に)次のようなXMLドキュメントを持っています:

...
<param>
    <key>age</key>
    <value>10</value>
</param>
<param>
    <key>smart</key>
    <value>true</value>
</param>
...

パラメータキーに基づいて使用可能な値を制限したいと思います。たとえば、ageは[0、150]の整数で、smartはtrueまたはfalseのいずれかである必要があります。

ここで、XMLが異なる場合(たとえば、以下の例のように)、非常に単純になります。

...
<age>10</age>
<smart>true</smart>
...

ただし、この時点ではXML構造は変更されないため、変更する必要があるかどうかはわかりません。現在のXML構造でこれらの種類の制約を実装する方法はありますか?もしそうなら、どのように?

アップデート:

フィードバック(完全な欠如)から判断すると、XSDを使用するとこれは不可能である可能性が高いと思います。誰かが確認できますか?

4

1 に答える 1

1

次のような定義が実際に必要になるようです。

  <!-- This is an INVALID example -->
  <xs:element name="param">
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="age" />
          <xs:element name="value" type="xs:decimal" />
        </xs:sequence>
        <xs:sequence>
          <xs:element name="key" type="xs:string" fixed="smart" />
          <xs:element name="value" type="xs:boolean" />
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>

残念ながら、そのようなコードは無効なXMLスキーマファイルになります。

構文は正しいですが、セマンティクスはスキーマ規則に違反しています。同じ名前で同じスコープの要素は、同じタイプである必要があります。この場合、特に、<value>要素の子であるすべての要素<param>が同じタイプでなければならないことを意味します。

正式には、これはスキーマコンポーネント制約:要素宣言の一貫性です。次のスキーマコンポーネント制約も参照してください。通常、要素タイプをドキュメント内の他の値やシーケンスの残りの項目に関する情報に依存させることはできません。

アップデート

これを完全に忘れましたが、純粋にスキーマで定義するのではなく、インスタンスドキュメントで目的のタイプを指定すると、必要な制約を取得できるはずです。これは、要素にxsi:type属性を追加することで実行できます。<value>

<param>
    <key>age</key>
    <value xsi:type="xs:decimal">10</value>
</param>
<param>
    <key>smart</key>
    <value xsi:type="xs:boolean">true</value>
</param>

もちろん、これはXML生成プロセスを変更する必要があるため、少し不便です。<key>また、と定義さxsi:typeれたペアが一致することを自動的に保証するものではありません。

于 2011-10-21T14:12:41.580 に答える