Можно ли удалить эту избыточность из моей схемы XML? - PullRequest
1 голос
/ 05 августа 2011

У меня следующая проблема:

У меня есть два сложных типа, foo и bar с обоими членами foobar:

<xs:complexType name="foo">
  <xs:sequence>
    <xs:element name="foobar" type="xs:string" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="bar">
  <xs:sequence>
    <xs:element name="foobar" type="xs:string" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>

Чтобы уменьшить избыточность, я хочу объявить foobar как complexType, на который ссылаются как foo, так и bar, что-то вроде этого:

<xs:complexType name="foobar">
  <xs:sequence>
    <xs:element type="xs:string />
  </xs:sequence>
</xs:complexType>

Но, похоже, это не правильный путь. Это действительно возможно в XML-схеме?

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Возможно, для этого лучше использовать элемент xs:group, а не сложный тип:

<xs:complexType name="foo">
    <xs:group ref="foobarGroup"/>
</xs:complexType>

<xs:complexType name="bar">
    <xs:group ref="foobarGroup"/>
</xs:complexType>

<xs:group name='foobarGroup'>
    <xs:sequence>
        <xs:element name="foobar" type="xs:string" maxOccurs="unbounded" />
    </xs:sequence>        
</xs:group>

Вы не можете выразить последовательность непосредственно как часть xs:complexType.

1 голос
/ 05 августа 2011

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

  <xs:complexType name="hasFoobar" abstract="true">
    <xs:sequence>
      <xs:element name="foobar" … />
    </xs:sequence>
  </xs:complexType>

А затем «расширить» этот абстрактный тип:

  <xs:complexType name="foo">
    <xs:complexContent>
      <xs:extension base="hasFoobar">
        …
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="bar">
    <xs:complexContent>
      <xs:extension base="hasFoobar">
        …
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
...