2015-09-24 2 views
0

У меня есть XML-схемы, которая определяет следующие типыXML Schema - simpleType со списком наследуется атрибутом

<xsd:complexType name="visualElement" abstract="true"> 
    <xsd:attribute name="id" type="xsd:ID"></xsd:attribute> 
    <xsd:attribute name="style" type="xsd:string"></xsd:attribute>  
</xsd:complexType> 

<xsd:complexType name="textElement"> 
    <xsd:complexContent> 
     <xsd:extension base="sa:visualElement"> 
      <xsd:attribute name="label" type="xsd:string" use="required" />   
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<xs:element name="text" type="textElement"/> 

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

<text id="myText" style="Fancy" label="This is the display text" /> 

When то, что я действительно хочу сделать, это определить это так:

<text id="myText" style="Fancy"> 
    This is the display text here. 
</text> 

my textElement Type должен расширить vi sualElement Type, поскольку мы генерируем Java-классы с JAXB для анализа XML. А затем с помощью наследования JaxB CLasses обрабатывать все визуальные элементы аналогичным образом.

Есть ли способ структурировать схему, чтобы я мог достичь желаемого формата XML, сохраняя при этом атрибуты типа visualElement?

ответ

0

Я думаю, вам нужно будет сделать visualElement, чтобы разрешить простой контент. Затем вы можете расширить или ограничить его в textElement. Что-то вроде:

<xsd:complexType name="visualElement" abstract="true"> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
      <xsd:attribute name="id" type="xsd:ID"></xsd:attribute> 
      <xsd:attribute name="style" type="xsd:string"></xsd:attribute>  
     </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 

<xsd:complexType name="textElement"> 
    <xsd:simpleContent> 
     <xsd:extension base="sa:visualElement"/> 
    </xsd:complexContent> 
</xsd:complexType> 

Я думаю, что вам действительно нужно сделать visualElement содержащий simpleContent, в противном случае вы не можете продлить его в textElement. Но попробуйте также:

<xsd:complexType name="visualElement" abstract="true"> 
    <xsd:attribute name="id" type="xsd:ID"></xsd:attribute> 
    <xsd:attribute name="style" type="xsd:string"></xsd:attribute>  
</xsd:complexType> 

<xsd:complexType name="textElement"> 
    <xsd:simpleContent> 
     <xsd:extension base="sa:visualElement"/> 
    </xsd:complexContent> 
</xsd:complexType> 

Я не думаю, что это сработает.

Другой вариант - использование attributeGroup s. Но это не будет хорошее наследство, которое вы хотите.

+0

Ваше первое предложение сработало. Однако, поскольку мы используем visualElement для ряда других типов, а некоторые из них не должны содержать строку, это все еще не совсем то, что нам нужно. Я уже попробовал свое второе предложение, это неверно. –

+0

Оглядываясь назад, если вы думаете об этом, я желаю многократного наследования ... я думаю, объясняет, почему я не очень далеко. Ради целесообразности мы уже застряли на этикетке. спасибо за ваши предложения. –

+0

@PaulHenry Вы не можете иметь множественное наследование, но у вас может быть агрегация с группами атрибутов. Вы также можете использовать плагин наследования, чтобы ваши классы реализовали определенный интерфейс - который в сочетании с группами атрибутов почти так же хорош, как и реальное множественное наследование. – lexicore

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