Мой новый частный язык XML включает элементы <figure>
, представляющие иллюстрации (изображение + подпись).
Всякий раз, когда иллюстрации ссылаются на какое-то изображение в локальной базе данных, я просто хочу набрать
<figure id="9809" width="full" />
, чтобы указать номер изображения 9809 и связанный с ним заголовок.
С другой стороны, если изображения приходят извне, мне понадобится немного другой синтаксис:
<figure href="https://some-url-here" width="full">Some ad hoc catpion</figure>
До сих пор я объявил элемент, который объединяет оба поведения, например:
<!-- Figures -->
<xs:simpleType name="FigureWidthEnum">
<xs:restriction base="xs:token">
<xs:enumeration value="center" />
<xs:enumeration value="half" />
<xs:enumeration value="full" />
</xs:restriction>
</xs:simpleType>
<xs:element name="figure">
<xs:complexType mixed="true">
<xs:complexContent>
<xs:extension base="Inline">
<xs:attribute name="href" type="URI" />
<xs:attribute name="id" type="xs:nonNegativeInteger" />
<xs:attribute name="width" type="FigureWidthEnum" default="full" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
Работает нормально, но новый редактор может связываться с 3 атрибутами и вводить невозможные вещи, которые я не хочу так просто пройти через Scheid Validator.Например:
<figure id="9809" width="full" href="https://some-unexpected-url">Some unexpected caption that should not be here</figure>
Я хочу иметь два совершенно разных синтаксиса для <figure>
, как если бы я мог объявить эти два элемента с одинаковым именем:
<xs:element name="figure">
<xs:complexType mixed="true">
<xs:complexContent>
<xs:extension base="Inline">
<xs:attribute name="href" type="URI" />
<xs:attribute name="width" type="FigureWidthEnum" default="full" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="figure">
<xs:complexType>
<xs:attribute name="id" type="xs:nonNegativeInteger" />
<xs:attribute name="width" type="FigureWidthEnum" default="full" />
</xs:complexType>
</xs:element>
На самом деле этоневозможно.
Можно ли это как-нибудь сделать?