我有一个简单的模式来描述游戏引擎的基于组件的子系统。某些组件类型对它们所在的组合有限制。
例如,系统定义了一个基本类型Selectable
,它又由Button
and扩展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">