4

2つの値しか持てない属性があります。
何を使うのが良いですか?
パターン?

<xsd:attribute name="sex">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="male|female" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:attribute>

または列挙?

<xsd:attribute name="sex">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"></xsd:enumeration>
            <xsd:enumeration value="female"></xsd:enumeration>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:attribute>

違いがない場合はパターン(1行少ない)を使用します

4

2 に答える 2

4

どちらも合法的なXSDであり、XSD単純型の適合または部分適合の実装で問題が発生する可能性は低いようです。また、それらの間の速度差を検出するには、大量のデータと非常に正確な測定が必要になると思います。では、「どちらが良いのか」という質問です。基本的には、「スキーマを読んだ人が理解しやすいのはどれか」という質問に相当します。

それはあなただけが答えることができる質問です。

価値があることについては、列挙を使用した定式化により、各値の意味または予想される使用法に関するドキュメントを提供できることを確認します。私が通常このような場合に列挙を使用するのは、おそらくそのためです。(「male」と「female」の値は十分に単純に見えますが、一部のスキーマでは、このような列挙には「unknown」と「declined-to-state」の値も含める必要があり、ユーザーはいつ行うべきかについてのガイダンスが必要になる場合があります。どの値を使用してください。)

于 2012-12-20T17:57:44.633 に答える
1

(違いに関する限り)注意すべきもう1つの点は、列挙をさらにエンコードできることです。つまり、idとvalueを持つ列挙型を持つことができます。「値」は、一般的なドロップリストに表示されるものと類似していると考えてください。IDは、システムに対する値を識別するために使用されます。したがって、各列挙型にはID->Valueのペアがあります。

ここで、これを考慮してください。XSLTを使用して画面のxmlをすばやくレンダリングする場合は、それに応じてドロップリストを解析および設定できるようにxsltを記述できます。ただし、パターン文字列を使用すると、別れるのが難しくなります。

最後に、私は多くのアプリケーションサーバーテクノロジー(WAS / JBOSS、TOMCAT、.NET / C#、Tibco、WMB、WPS、WESB、ALBPM、DatapowerなどのESBなど)を使用してきましたが、それぞれに微妙な違いがあります。 xml検証を行います。いくつか例を挙げると、境界条件の検証(null vs空白値vs、タグなし、vsタグ+ xsi:nil = true)に注意してください。一部のテクノロジでは、XML列挙もこのカテゴリに分類されます。彼らはそれをうまくサポートしていません(あなたが話している技術によって異なります)。たとえば、私の経験では、JBOSS6.0にはスキーマのパターンベースの制限の検証に問題があることがわかりました。(それは私の経験です。JBOSS愛好家がやって来てこれに異議を唱えることは知っていますが、私の経験を変えることはありません... :)

列挙型やパターンについて私が気に入らないのは、スキーマでビジネス/システムの制約を定義していることです。進化するアーキテクチャーにスキーマを再利用することを考えると、新しい許可された値を追加する場合、既存のインターフェースとWSDSLを更新する方法で多くのやり直しが発生します。私のソリューションは通常、私のソリューションの入門書で許可された値の検証を行うことを含みます。これにより、すべての統合レイヤーは、統合レイヤーに到達するメッセージがそのコンテンツで有効である/有効である必要があると想定できます。

これが誰かに役立つことを願っています...

于 2014-02-10T13:50:56.020 に答える