[XML-Schema] реализация наследования

oleg1331

Возможно ли (кто-нибудь знает как?) реализовать на XML-Schema что-то типа наследования? то есть строго описать конструкции типа

<object type="ObjectType">
CONTENT
</object>

где CONTENT зависит от ObjectType и может быть как простым типом (строка, число, дата и т.п. так и сложным (содержать в себе другие тэги, ComplexType, если в терминах XML-Schema)
И после всего этого описания верна ли будет конструкция вида

<xsd:complexType name="TObjects">
<xsd:sequence>
<xsd:element name="object" type="TObject" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>

где TObject - это базовый тип для всех объектов

katrin2201

попробуй описать каждый тип объекта отдельно как обычно без всяких наследований, а потом сделать от них от всех xsd:choose

oleg1331

да, это на самом деле первое, что мне пришло в голову.
но смущает то, что есть атрибут base у simpleType и complexType - они позволяют указать базовый тип. а внутри - ограничения относительного базового типа.
только вот как выбрать базовый тип так, чтобы можно было и простые типы описывать (не содержащие внутри тэгов и сложные..
мне кажется, такая возможность должна быть, просто я пока не знаю как :(

katrin2201

Это имеет смысл, если у тебя у всевозможных наборов CONTENT можно выделить общий кусок.
Если можно - его в базовый тип и пихай. А так имхо не стоит оно того, чтобы сильно запариваться.

oleg1331

нет, одинакового куска нет.. ок. тогда делаем choose и не паримся
хотя (чисто гипотетически) вопрос остаётся открытым :)

Saloed

XSD Document
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="container">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="component" type="parent" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:complexType name="parent" abstract="true"/>

<xsd:complexType name="childA">
<xsd:complexContent>
<xsd:extension base="parent">
<xsd:sequence>
<xsd:element name="a" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="atr" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="childB">
<xsd:complexContent>
<xsd:extension base="parent">
<xsd:sequence>
<xsd:element name="b" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

</xsd:schema>



XML DOCUMENT

<?xml version="1.0" encoding="UTF-8"?>
<container xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Test.xsd">

<component xsi:type="childA" atr="value of atr">
<a>content of a</a>
</component>

<component xsi:type="childB">
<b>content of b</b>
</component>

</container>


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

<component xsi:type="childA" ...>
<component xsi:type="childB">
Оставить комментарий
Имя или ник:
Комментарий: