2

既存の XML ドキュメントの XSD を作成しようとしています。XML を実際に変更することはできないため、XSD を適合させる必要があります (これはやや逆であることはわかっています)。

XML には、Group と呼ばれる要素があります。この要素には 1 つ以上の機能があります。約 40 の有効な機能名があります。そこで、それらを Enum としてモデル化することにしました。列挙型は次のようになります。

<xs:simpleType name="FeatureNamesEnumType">
    <xs:restriction base="xs:normalizedString">
        <xs:enumeration value="Feature1"/>
        <xs:enumeration value="Feature2"/>
        <xs:enumeration value="Feature3"/>
    </xs:restriction>
</xs:simpleType>

次に、グループには次のものがあります。

<xs:complexType name="groupType">
    <xs:attribute type="FeatureNamesEnumType" name="features" use="required"/>
  </xs:complexType>

私がよく遭遇する問題は、XML ファイルで、属性が機能のコンマ区切りリストに設定されている可能性があることです。例えば:

<group name="Group1"
       features="Feature1,Feature2"
</group>

このコンマ区切りのリストは列挙に含まれていないため、これは XSD に対して検証されません。

グループに一連のフィーチャを含めるのが最善であることはわかっていますが、XML ファイルを変更できないため、それはオプションではありません。

私の目標は、機能が列挙値と一致しない場合に検証を失敗させることです。したがって、たとえば、次を無効にしたいと思います。

<group name="Group1"
           features="Feature1,Featur2"
</group>

スペルミスにより、これが無効になるはずです。Group の features 属性が、有効な列挙値のみで構成されたコンマ区切りのリストを受け入れることを XSD で示す方法はありますか?

4

2 に答える 2

3

XSD 1.0 だけでは、必要な制約を定義するために使用することはできません。これらのフィールドを前処理または後処理してコンマを空白に置き換えることができれば、FeatureNamesEnumType.

適切なアプローチは、プラットフォームによって異なります。たとえば、.NET の場合、これらのフィールドを文字列として定義し、おそらく xsd:pattern; によって制約されます。次に、上記の xsd:list として定義された単純型に対して各フィールドの値を手動で検証します。これは .NET で行うのが非常に簡単なことです。これらのフィールドに効率的に到達する方法は、処理モデルによって異なります...

于 2013-02-13T16:29:04.433 に答える