Абстракция в XSD - PullRequest
       4

Абстракция в XSD

2 голосов
/ 27 июня 2010

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

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

<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. Есть ли способ получить то, что я хочу?

1 Ответ

2 голосов
/ 27 июня 2010

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

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

<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" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...