いくつかのオプションがあります。
(1) 次の行に沿って、かなり精巧な正規表現を記述することで、説明した制約を適用できます。
- 4 つの文字列すべてが存在するすべての有効な値は、シーケンスの順列 ("HASCALCULATOR"、"READ ONLY"、"LISTUPDATENEEDED"、"MANDATORY") の連結です。
- 存在する文字列が 4 つ未満のすべての正当な値は、いくつかの順列を連結したプレフィックスです。
したがって、4 つの文字列の 24 の順列を計算し、接尾辞をオプションにすることで、正規表現を完全に書き出すことができます。
<xs:simpleType name="properties">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:pattern value="((HASCALCULATOR (LISTUPDATENEEDED
(READ ONLY (MANDATORY)?)?)?)|(HASCALCULATOR
(LISTUPDATENEEDED (MANDATORY (READ ONLY)?)?)?)|(HASCALCULATOR
(READ ONLY (LISTUPDATENEEDED (MANDATORY)?)?)?)|(HASCALCULATOR
(READ ONLY (MANDATORY (LISTUPDATENEEDED)?)?)?)|(HASCALCULATOR
(MANDATORY (LISTUPDATENEEDED (READ ONLY)?)?)?)|(HASCALCULATOR
(MANDATORY (READ ONLY
(LISTUPDATENEEDED)?)?)?)|(LISTUPDATENEEDED (HASCALCULATOR
(READ ONLY (MANDATORY)?)?)?)|(LISTUPDATENEEDED (HASCALCULATOR
(MANDATORY (READ ONLY)?)?)?)|(LISTUPDATENEEDED (READ ONLY
(HASCALCULATOR (MANDATORY)?)?)?)|(LISTUPDATENEEDED (READ ONLY
(MANDATORY (HASCALCULATOR)?)?)?)|(LISTUPDATENEEDED (MANDATORY
(HASCALCULATOR (READ ONLY)?)?)?)|(LISTUPDATENEEDED (MANDATORY
(READ ONLY (HASCALCULATOR)?)?)?)|(READ ONLY (HASCALCULATOR
(LISTUPDATENEEDED (MANDATORY)?)?)?)|(READ ONLY (HASCALCULATOR
(MANDATORY (LISTUPDATENEEDED)?)?)?)|(READ ONLY
(LISTUPDATENEEDED (HASCALCULATOR (MANDATORY)?)?)?)|(READ ONLY
(LISTUPDATENEEDED (MANDATORY (HASCALCULATOR)?)?)?)|(READ ONLY
(MANDATORY (HASCALCULATOR (LISTUPDATENEEDED)?)?)?)|(READ ONLY
(MANDATORY (LISTUPDATENEEDED (HASCALCULATOR)?)?)?)|(MANDATORY
(HASCALCULATOR (LISTUPDATENEEDED (READ ONLY)?)?)?)|(MANDATORY
(HASCALCULATOR (READ ONLY (LISTUPDATENEEDED)?)?)?)|(MANDATORY
(LISTUPDATENEEDED (HASCALCULATOR (READ ONLY)?)?)?)|(MANDATORY
(LISTUPDATENEEDED (READ ONLY (HASCALCULATOR)?)?)?)|(MANDATORY
(READ ONLY (HASCALCULATOR (LISTUPDATENEEDED)?)?)?)|(MANDATORY
(READ ONLY (LISTUPDATENEEDED (HASCALCULATOR)?)?)?))?">
<xs:annotation>
<xs:documentation>
The pattern here was calculated this way.
1 Let A = "HASCALCULATOR", B = "LISTUPDATENEEDED",
C = "READ ONLY", and D = "MANDATORY".
2 Calculate the permutations of the sequence (A,B,C,D).
A sequence with four members has 4! = 24 permutations:
(A,B,C,D), (A,B,D,C), (A,C,B,D), (A,C,D,B), ...
3 From each permutation generate a regex of the form
(s1 (s2 (s3 (s4)?)?)?)
4 Join all of these in single optional choice.
</xs:documentation>
</xs:annotation>
</xs:pattern>
</xs:restriction>
</xs:simpleType>
(2) 論理和を左因数分解することにより、より冗長なバージョンを生成できます。
(A (B, (C, (D)?)?)?)
|(A (B, (D, (C)?)?)?)
|(A (C, (B, (D)?)?)?)
|(A (C, (D, (B)?)?)?)
のようなものになります
(A ((B ((C D?)|(D C?))?
| (C ((B D?)|(D B?))?)
| (D ((B C?)|(C B?))?)))
(3)素材の表現を考え直すことができます。たとえば、4 つの文字列のいずれかの存在をフラグとして扱い、繰り返しを無視することができます。これにより、スケッチしたようなパターンが機能します。
(4) フラグを 4 つのブール属性として表すことができるため、代わりに
<xs:element name="properties" type="tns:properties"/>
<!--* assumes the declaration for 'properties' type
* given above *-->
あなたは次のようなものを書きます:
<xs:element name="properties">
<xs:complexType>
<xs:attribute name="has-calculator" type="xs:boolean"/>
<xs:attribute name="mandatory" type="xs:boolean"/>
<xs:attribute name="read-only" type="xs:boolean"/>
<xs:attribute name="list-update-needed" type="xs:boolean"/>
</xs:complexType>
</xs:element>
(5) フラグを空の要素として表すことができます。これは、発生することによってプロパティを通知します。
<xs:complexType name="empty">
<xs:sequence/>
</xs:complexType>
<xs:element name="properties">
<xs:complexType>
<xs:all>
<xs:element name="has-calculator"
type="tns:empty" minOccurs="0"/>
<xs:element name="mandatory"
type="tns:empty" minOccurs="0"/>
<xs:element name="read-only"
type="tns:empty" minOccurs="0"/>
<xs:element name="list-update-needed"
type="tns:empty" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
私自身、オプション(5)を使用する傾向があります。しかし、すべて大文字の文字列と相まって、質問の一般的な感じから、十分に確立されたシステムからの出力を扱っており、形式を変更することは現実的ではないと思います。