2009-09-30 8 views
16

Supongamos que tengo algún esquema:uso de esquemas XML para extender un elemento en lugar de 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> 

Esto define un elemento foo que tiene en su interior algún elemento fooElement con una cuerda tipo. Me gustaría extender ahora el elemento foo para que también tenga un elemento barElement y llame a esta extensión bar.

Para complicar las cosas, supongamos que alguien más ha definido foo y no se puede cambiar el esquema. Si bien el ejemplo aquí es trivial, supongamos también que el contenido de foo podría ser más complicado, y que definir un nuevo esquema no es tan simple como copiar el elemento fooElement.

Efectivamente, me gustaría definir un nuevo esquema:

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

Desafortunadamente <xsd:extension> 's base atributo sólo acepta argumentos de tipo XSD, no elementos. ¿Cómo extiendo un elemento? (¿Puedo extender un elemento?)

+3

Gran pregunta, me gustaría hacer exactamente lo mismo, y me da incredulidad que parezca imposible. ¡Loca! –

Respuesta

8

Crearía un nuevo tipo que imite el elemento foo y luego se extienda desde él. Si bien no es la mejor solución, obtienes el mismo resultado que si pudieras ampliar el elemento directamente.

<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

¿No me obligaría esto a encapsular el elemento cada vez que lo llamé? daría como resultado una sintaxis como en lugar de simplemente ... lo cual es indeseable. –

+0

No, el resultado es que creo que lo que estaba pidiendo: Ben

+0

Teniendo en cuenta su edición estoy dispuesto a estar de acuerdo, gracias. –

Cuestiones relacionadas