2009-09-30 11 views
16

Supponiamo ho qualche schema:Utilizzare XML Schema di estendere un elemento piuttosto che un 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> 

Questo definisce qualche elemento foo che ha al suo interno un elemento fooElement con tipo stringa. Vorrei ora estendere l'elemento foo per avere anche un elemento barElement e chiamare questa estensione bar.

Per complicare le cose, supponiamo anche che qualcun altro abbia definito foo e che lo schema non possa essere modificato. Sebbene l'esempio qui sia banale, assumiamo anche che il contenuto di foo potrebbe essere più complicato e che la definizione di un nuovo schema non è tanto semplice quanto la copia dell'elemento fooElement.

In effetti, mi piacerebbe definire un nuovo schema:

<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> 

Purtroppo <xsd:extension> 's base attributo accetta solo argomenti di tipo XSD, non elementi. Come estendere un elemento? (Posso estendere un elemento?)

+3

Grande domanda, mi piacerebbe fare la stessa identica cosa - e sono incredulo che sembra impossibile. Pazzo! –

risposta

8

Creerei un nuovo tipo che imita l'elemento foo e quindi ne estrae. Anche se non è la soluzione migliore, ottieni lo stesso risultato come se tu fossi in grado di estendere direttamente l'elemento.

<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

Non mi costringerebbe a incapsulare l'elemento ogni volta che l'ho chiamato? risulterebbe in una sintassi come anziché semplicemente ... il che è indesiderabile. –

+0

No, il risultato è che penso che cosa stavi chiedendo: Ben

+0

Data la tua modifica sono incline a concordare - grazie. –

Problemi correlati