2009-09-30 9 views
16

Załóżmy, że mam pewien schemat:Wykorzystanie XML Schema do rozszerzenia elementu, zamiast complexType

<xsd:schema ...> 
    <xsd:element name="foo"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="fooElement" type="xs:string" /> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

ta określa jakiś element foo, który ma w środku jakiś element fooElement z typu string. Chciałbym teraz rozszerzyć element foo o element barElement i wywołać to rozszerzenie bar.

Aby to komplikować, załóżmy, że ktoś inny zdefiniował foo, a schematu nie można zmienić. Chociaż tutaj przykład jest banalny, załóżmy również, że zawartość foo może być bardziej skomplikowana, a definiowanie nowego schematu nie jest tak proste jak kopiowanie elementu.

Skutecznie, chciałbym zdefiniować nowy schemat:

<xsd:schema xmlns:fns="otherschema" ...> 
    <xsd:import namespace="otherschema" /> 
    <xsd:element name="bar"> 
     <xsd:complexContent> 
      <xsd:extension base="fns:foo"> 
       <xsd:sequence> 
        <xsd:element name="barElement" type="xs:string" /> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:element> 
</xsd:schema> 

Niestety <xsd:extension> „s base atrybut przyjmuje tylko argumenty typu XSD, a nie elementów. Jak mogę rozszerzyć element? (czy mogę przedłużyć element?)

+3

Świetne pytanie, chciałbym zrobić dokładnie to samo - i nie mogę uwierzyć, że wydaje się to niemożliwe. Zwariowany! –

Odpowiedz

8

Utworzę nowy typ, który naśladuje element foo, a następnie rozszerzy go. Chociaż nie jest to najlepsze rozwiązanie, otrzymujesz taki sam wynik, jak gdybyś mógł bezpośrednio rozszerzyć element.

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

    <xs:complexType name="barType"> 
    <xs:complexContent mixed="false"> 
     <xs:extension base="fooType"> 
     <xs:sequence> 
      <xs:element name="barElement" type="xs:string" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="bar" type="barType" /> 
+0

Czy nie zmusiłoby mnie to do hermetyzacji elementu za każdym razem, gdy go nazywałem? powodowałby składnię, taką jak: , a nie po prostu ... co jest niepożądane. –

+0

Nie, w rezultacie myślę, o co prosiłeś: Ben

+0

Biorąc pod uwagę Twoją edycję, jestem skłonny się z tym zgodzić - dziękuję. –

Powiązane problemy