0

我有一个简单的模式来描述游戏引擎的基于组件的子系统。某些组件类型对它们所在的组合有限制。

例如,系统定义了一个基本类型Selectable,它又由Buttonand扩展Toggle。单个对象只能容纳 1 个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) &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