Derivación de tipo complejo mediante el mecanismo de extensión
Un tipo complejo derivado por extensión es un supraconjunto funcional del tipo de datos base correspondiente. Como el propio nombre indica, el tipo de datos base correspondiente constituye la base para el tipo que se está definiendo, donde las diferencias con respecto al tipo base son de naturaleza aditiva. En este tema se proporciona un ejemplo en el que los dos elementos ShippingAddress y BillingAddress se basan en el tipo global complejo GlobalAddrType. ShippingAddress se define simplemente como de tipo GlobalAddrType, mientras que BillingAddress se define para extender el tipo GlobalAddrType. Al final del ejemplo, se agrega un elemento adicional a BillingAddress, denominado Department, con un tipo de cadena y un valor predeterminado de Accounts Payable.
Para obtener información completa acerca de cómo derivar nuevos tipos complejos mediante el mecanismo de extensión, consulte el sitio Web de W3C. Para obtener varios vínculos a este y otros sitios web, consulte Recursos XSD en la Web.
Para derivar de un tipo global complejo por extensión, en otra ubicación del árbol de esquema, comience insertando un nuevo nodo Record en la ubicación deseada. A continuación, establezca su propiedad Tipo de datos base en el nombre de un tipo global complejo.
En el ejemplo siguiente, BillingAddress es el nombre del nodo Record recién insertado y GlobalAddrType es el nombre del tipo global complejo del que deriva y pretende extenderse. En la vista de árbol de esquema, después de establecer el tipo de datos base en GlobalAddrType, se mostrará una estructura de nodo duplicada debajo del nodo denominado BillingAddress, idéntica a la estructura de nodos adyacente bajo el nodo denominado ShippingAddress. La diferencia entre ellos es que la estructura del nodo BillingAddress será extensible más allá del tipo de datos base GlobalAddrType y la estructura ShippingAddress seguirá siendo idéntica al tipo de datos base GlobalAddrType.
Antes, con un nodo recién insertado denominado BillingAddress.
<xs:schema> <xs:element name="Root"> <xs:complexType> <xs:sequence> <xs:element name="ShippingAddress" type="GlobalAddrType" /> <xs:element name="BillingAddress"> <xs:sequence /> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="GlobalAddrType"> [Address structure defined globally here.] </xs:complexType> </xs:schema>
Después de derivar del tipo base complejo GlobalAddrType, por extensión.
<xs:schema> <xs:element name="Root"> <xs:complexType> <xs:sequence> <xs:element name="ShippingAddress" type="GlobalAddrType" /> <xs:element name="BillingAddress"> <xs:complexType> <xs:complexContent mixed="false"> <xs:extension base="GlobalAddrType" /> </xs:complexContent> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="GlobalAddrType"> [Address structure defined globally here.] </xs:complexType> </xs:schema>
Para especificar extensiones para el tipo de datos base, inserte nodos en el nodo BillingAddress en el árbol de esquema. El siguiente fragmento XSD muestra cómo se expande el elemento de extensión vacío cuando se inserta un nodo Grupo de secuencias como un nuevo elemento secundario del nodo BillingAddress y, a continuación, se inserta un nodo Elemento de campo , denominado PaymentType, como nodo secundario del nodo Grupo de secuencias .
<xs:extension base="GlobalAddrType">
<xs:sequence>
<xs:element default="Accounts Payable"
name="Department" type="xs:string" />
</xs:sequence>
</xs:extension>