0

ゲーム エンジンのコンポーネント ベースのサブシステムを記述する単純なスキーマがあります。特定のコンポーネント タイプには、それらを見つけることができる組み合わせに制限があります。

たとえば、システムはベース タイプ を定義し、これはおよびSelectableによって拡張されます。1 つのオブジェクトは 1 つのコンポーネントしか保持できません。ButtonToggleSelectable

私の 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) &lt; 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">

4

0 に答える 0