У меня есть простая схема, описывающая компонентную подсистему игрового движка. Некоторые типы компонентов имеют ограничения на комбинации, в которых они могут быть найдены.
Например, система определяет базовый тип 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">