Может ли встроенный Schematron видеть типы XSD?

У меня есть простая схема, описывающая компонентную подсистему игрового движка. Некоторые типы компонентов имеют ограничения на комбинации, в которых они могут быть найдены.

Например, система определяет базовый тип 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) &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">


person Selali Adobor    schedule 15.10.2014    source источник
comment
И я забыл отметить, текущий assert на самом деле не делает ничего, что делает Schematron необходимым. Его можно заменить выбором в XSD.   -  person Selali Adobor    schedule 15.10.2014
comment
возможный дубликат Как проверить в XPATH, равен ли тип типу или является производным от типа   -  person Paul Sweatte    schedule 14.06.2015