Можно ли иметь несколько групп замещения для каждого типа элемента? - PullRequest
3 голосов
/ 13 марта 2010

Допустим, в схеме есть следующее:

    <xsd:complexType name="shape"/>

    <xsd:complexType name="circle">
            <xsd:complexContent>
                <xsd:extension base="shape">
                    <xsd:attribute name="radius" type="xsd:double"/>
                </xsd:extension>
            </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="arc">
                <xsd:complexContent>
                    <xsd:extension base="circle">
                        <xsd:attribute name="startAngle" type="xsd:double"/>
                        <xsd:attribute name="endAngle" type="xsd:double"/>
                    </xsd:extension>
                </xsd:complexContent>
    </xsd:complexType>

Затем можно добавить группу замещения, подобную этой

<xsd:element name="shape" type="shape" abstract="true"/>
<xsd:element name="circle" type="circle" substitutionGroup="shape"/>
<xsd:element name="arc" type="arc" substitutionGroup="shape"/>

, а затем принять любой из этих типов, ссылаясь на группу как:

<xsd:element ref="shape"/>

Эта часть не проблема.

Но что, если я также хочу разрешить (в другом разделе) просто кружок и его подтип?

Можно ли добавить несколько групп замещения, чтобы эмулировать правильное наследование в схеме? Я попытался добавить другой тип элемента, например:

<xsd:element name="shape" type="shape" abstract="true"/>
<xsd:element name="circle" type="circle" substitutionGroup="shape"/>
<xsd:element name="arc" type="arc" substitutionGroup="shape"/>
<xsd:element name="arc2" type="arc" substitutionGroup="circle"/>

Но я бы предпочел не менять имя ожидаемого элемента в зависимости от того, что я ожидаю.

Есть ли лучший способ сделать это?

1 Ответ

3 голосов
/ 14 марта 2010

Вы должны иметь возможность просто оставить arc вместо circle. Куда бы вы ни использовали shape, тогда применяются circle или arc, а где вы используете circle, либо circle или arc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...