ゲーム エンジンのコンポーネント ベースのサブシステムを記述する単純なスキーマがあります。特定のコンポーネント タイプには、それらを見つけることができる組み合わせに制限があります。
たとえば、システムはベース タイプ を定義し、これはおよびSelectable
によって拡張されます。1 つのオブジェクトは 1 つのコンポーネントしか保持できません。Button
Toggle
Selectable
私の XSD スキーマは、この関係を反映しています (抜粋)。
<xs:complexType name="Selectable">
<xs:complexContent>
<xs:extension base="Component"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Button">
<xs:complexContent>
<xs:extension base="Selectable"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Toggle">
<xs:complexContent>
<xs:extension base="Selectable">
<xs:attribute name="OnClickedCallback" type="Callback"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
これで、次のようなアサーションを使用して、前述の制限を手動で定義できます。
<xs:annotation>
<xs:appinfo>
<sch:pattern id="SingleSelectable">
<sch:rule context="Transform">
<sch:assert test="count(Button) + count(Toggle) < 2">
A transform can only have one selectable component.
</sch:assert>
</sch:rule>
</sch:pattern>
</xs:appinfo>
</xs:annotation>
ただし、このアプローチはスケーラビリティに欠けます。新しいタイプごとに手動で追加し、番号を更新する必要があります。
質問:ファイルで定義した型情報にアクセスする方法はありxsd
ますか?
何かのようなもの<sch:assert test="count(*[extends('Selectable')] < 2">