我有一个简单的架构,描述了游戏引擎的基于组件的子系统。某些组件类型对它们可以找到的组合有限制。
例如,系统定义基本类型Selectable
,然后由Button
和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) < 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">