答えは、正確に何を言いたいかによって異なります。また、使用しているスキーマ言語によっても異なります: DTD? XSD1.0? XSD1.1? リラックスNG? 他の ...?ああ、そうです、質問に XSD というタグが付いていることがわかりました。そのため、XSD ソリューションを探していると仮定します。
orderStatus
要素がシーケンス、、またはシーケンスのいずれかを子として持つことができ、属性およびはオプションであると言いたい場合、コンテンツ モデルでそう言うのは簡単です。orderId
orderedBy
orderedOn
shipStatus
shipStatus
modifyShipStatus
DTD 記法 (簡潔にするためにここで使用します) では、次のように記述します。
<!ELEMENT orderStatus ((orderId, orderedBy, orderedOn) | shipStatus) >
<!ATTLIST orderStatus
shipStatus CDATA #IMPLIED
modifyShipStatus CDATA #IMPLIED
>
または XSD 表記で、次のように記述します。
<xs:element name="orderStatus" type="my:orderStatus"/>
<xs:complexType name="orderStatus">
<xs:choice>
<xs:sequence>
<xs:element ref="my:orderId"/>
<xs:element ref="my:orderedBy"/>
<xs:element ref="my:orderedOn"/>
</xs:sequence>
<xs:element ref="my:shipStatus"/>
</xs:choice>
<xs:attribute name="shipStatus"/>
<xs:attribute name="modifyShipStatus"/>
</xs:complexType>
その後、完了です。
2 つの属性のうちの 1 つだけを許可したい場合、または正当な子をどちらかの属性が存在するかどうかに依存させたい場合、事態はさらに複雑になります。(一部のドキュメント デザイナーは、必要に応じて、同じ名前で呼び出すことを主張している 2 つのまったく異なる要素タイプがあり、検証が不必要に困難になると言うでしょう。)
その場合、次の選択肢があります。
上記のように DTD および/または XSD 1.0 スキーマを使用し、追加の制約をドキュメントで表現するか、Schematron を使用するか、または他の方法で表現します。
XSD 1.1 を使用し、上記のようにコンテンツ モデルと属性を定義し、それを示すアサーションを追加します。
- 属性の 1 つだけであり、表示する必要が
shipStatus
ありmodifyShipStatus
ます。
shipStatus
という名前の子が表示される場合にのみ、属性を表示する必要がありorderId
ます。
modifyShipStatus
という名前の子が表示される場合にのみ、属性を表示する必要がありshipStatus
ます。
XSD 1.1 を使用し、要素の 2 つの形式に対して 2 つの異なる型を定義し、orderStatus
条件付きの型割り当てを使用して、次の場合にどの型が適用されるかを示します。
XSD は次のようになります。
<xs:complexType name="orderStatus1">
<xs:sequence>
<xs:element ref="my:orderId"/>
<xs:element ref="my:orderedBy"/>
<xs:element ref="my:orderedOn"/>
</xs:sequence>
<xs:attribute name="shipStatus"/>
</xs:complexType>
<xs:complexType name="orderStatus2">
<xs:element ref="my:shipStatus"/>
<xs:attribute name="modifyShipStatus"/>
</xs:complexType>
<xs:element name="orderStatus">
<xs:alternative test="@shipStatus" type="my:orderStatus1"/>
<xs:alternative test="@modifyShipStatus" type="my:orderStatus2"/>
</xs:element>
- ついでに言うと、Relax NG の強みの 1 つとして、この種の制約を定式化できることを、熱心なユーザーがよく挙げています。