1

動物の要素がある場合:

<animal name="dog"/>

name 属性の値として次のものを使用できます。

  • $(ANY_STRING)

$(ANY_STRING) は、一部のソフトウェアが実行して後で検証する単純な名前と値の置換です (ANY_STRING は文字通り任意の文字列です)。この要素の XML スキーマはどのようになりますか? 既知の 3 つの名前に限定するのは簡単です。

  <xs:simpleType name="AnimalNames">
    <xs:restriction base="xs:string">
      <xs:enumeration value="dog"/>
      <xs:enumeration value="cat"/>
      <xs:enumeration value="bird"/>
    </xs:restriction>
  </xs:simpleType>

$(ANY_STRING) の制限も同様に簡単です (xs:pattern を使用して制限します)。しかし、属性は単純なタイプしかない可能性があるため、属性が列挙のリストまたは $(ANY_STRING) 値に含まれる可能性があることを指定することは可能ですか?

私が検討した別のオプションは、以下のパターンを制限することです。

<xs:pattern value="dog|cat|bird|$(.*)"/>

可能な値のリストが大きくなるにつれて、それはかなり厄介になりますが。

もちろん、最も簡単なオプションは文字列型を宣言することですが、それよりも制限を加えたいと思います。

4

1 に答える 1

0

ドキュメント用に明示的に指定された既知の値のセットを使用して、このようなセミクローズド リストを定義する 1 つの方法と、他の文字列も許可するエスケープ ハッチを使用する方法の 1 つは、AnimalNames型と型の和集合を使用して属性を定義することです。 xs:NMTOKEN または xs:Name (または、列挙されていない他の名前に対する制約を最も適切にキャプチャする組み込み型またはユーザー定義型)。

guidot がコメントで指摘しているように、そのような共用体は、最も包括的なメンバー型と同じ値のセットを受け入れるため、ゲートキーピングのみを目的とするスキーマでは無意味です。この手法は、ドキュメンテーションや型駆動型ディスパッチ (検証メンバー型がAnimalNamesdo X の場合、それ以外は do Y の場合) に役立ちます。

どのメンバー型が共用体型の特定の値を検証したかについての情報を提供しないスキーマ バリデーターに対応するために、一部のボキャブラリ デザイナーは guidot が示唆するように行い、2 つの要素型を提供します。他の名前の場合。または、文字列、、、およびAnimalNamesを受け入れる型を指定し、型を持つ属性を定義し、 の場合にのみ意味を持つと定義される別の属性 ( と呼ぶ) を定義します。したがって、犬は次を使用して記述されます。dogcatbirdothernameAnimalNamesother-namename="other"

<animal name="dog"/>

とハムスター

<animal name="other" other-name="hamster"/>

これにより、他の名前を受け入れながら、よく知られている名前を特別に処理することがかなり簡単になります。

于 2012-08-23T22:42:53.703 に答える