2010-06-27 4 views
2

Я работаю над XSD. Я хотел бы иметь элемент container (сложный тип), который содержит любой элемент, базовый тип которого - component.Абстракция в xsd

Один подход ...

<complexType name="Container"> 
    <sequence> 
     <element name="Child" type="am:Component"></element> 
    </sequence> 
</complexType> 

Но проблема есть мои компоненты называются дети. Предположим, у меня есть 3 компонента, foo, bar и baz. Я хотел бы быть в состоянии сделать документ, который был похож ...

<container> 
    <foo fooTag="foo"/> 
    <foo fooTag="foo"/> 
    <baz bazTag="baz"/> 
    <bar barTag="bar"/> 
</container> 

При первом подходе я бы в конечном итоге с ...

<container> 
    <child fooTag="foo"/> 
    <child fooTag="foo"/> 
    <child bazTag="baz"/> 
    <child barTag="bar"/> 
</container> 

я мог бы просто использовать xs:any но тогда я бы потерял свое утверждение о том, что ребенок должен быть component. Есть ли способ получить то, что я хочу?

ответ

2

В конечном счете вы должны уметь сказать: «Тип Foo представлен элементом с именем foo», и это то, что делает атрибут name элемента xs :. Вы не можете делать абсолютную абстракцию (как вы могли бы на языке программирования), потому что типы - это просто определения и не имеют определенного имени элемента, пока вы не дадите ему один.

Вам нужно будет указать все возможные подтипы в вашей последовательности.

<xs:sequence> 
    <xs:choice> 
     <xs:element name="type1" type="Type1" /> 
     <xs:element name="type2" type="Type2" /> 
     <xs:element name="type3" type="Type3" /> 
     <xs:element name="type4" type="Type4" /> 
    </xs:choice> 
</xs:sequence> 

Вы также можете определить имена элементов во всем мире и относятся к ним, как это так, но в конечном счете, вам все еще нужно указать, какой дочерний элемент имена действительны внутри контейнера элемента.

<xs:sequence> 
    <xs:any> 
     <xs:element ref="type1" /> 
     <xs:element ref="type2" /> 
     <xs:element ref="type3" /> 
     <xs:element ref="type4" /> 
    </xs:any> 
</xs:sequence> 

И в другом месте:

<xs:element name="type1" type="Type1" /> 
<xs:element name="type2" type="Type2" /> 
<xs:element name="type3" type="Type3" /> 
<xs:element name="type4" type="Type4" /> 
+0

Я боялся. Спасибо за хороший ответ и примеры. – Pace

+0

Да ... к сожалению, это поведение противоречит интуиции любому, кто приходит с точки зрения программирования. Хотя это ограничение подтверждается, например, в веб-службах .NET: генератор WSDL недостаточно умен, чтобы иметь возможность обрабатывать подтипы, если вы явно не указали, какие подтипы данного типа действительны (через XmlIncludeAttribute). –

Смежные вопросы