Altova XMLSpy 2025 Enterprise Edition 

La asignación de tipos condicionales es una característica de la especificación XSD 1.1. Con esta característica podemos permitir que el tipo de un elemento venga determinado por el contenido del documento XML, en concreto por el valor de los atributos del elemento o por la presencia o ausencia de determinados atributos. Por ejemplo, imaginemos que el documento XML tiene este elemento:

 

<publication kind="magazine">

...

</publication>

 

En el esquema, podemos indicar que el tipo del elemento publication puede variar dependiendo del valor que tome el atributo @kind del elemento en el documento de instancia. En el esquema esto se indica usando el elemento alternative, que es nuevo en la especificación XSD 1.1. Podemos especificar varios tipos alternativos, cada uno en un elemento alternative diferente.

 

En el ejemplo de la imagen siguiente, el elemento Publication se declaró con tres elementos secundarios alternative. Dos de ellos tienen un atributo test (@kind eq 'magazine' y @kind eq 'book'). El tercer elemento alternative no tiene el atributo test, pero tiene una asignación de tipo simple xs:error (esta asignación se hizo en el ayudante de entrada Detalles y no aparece en el diagrama). Si se desencadena, esta asignación devuelve un error de validación XML.

CTAAlternatives01

El código de estas declaraciones sería este:

 

<xs:complexType name="PublicationType">

   <xs:sequence>

 <xs:element name="Title" type="xs:string"/>

 <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>

 <xs:element name="Date" type="xs:gYear"/>

   </xs:sequence>

   <xs:attribute name="kind" type="xs:string"/>

</xs:complexType>

 

<xs:complexType name="MagazineType">

   <xs:complexContent>

 <xs:restriction base="PublicationType">

              <xs:sequence>

         <xs:element name="Title" type="xs:string"/>

         <xs:element name="Date" type="xs:gYear"/>

    </xs:sequence>

 </xs:restriction>

   </xs:complexContent>

</xs:complexType>

 

<xs:element name="Publication" type="PublicationType">

   <xs:alternative test="@kind eq 'magazine'" type="MagazineType"/>

   <xs:alternative test="@kind eq 'book'">

 <xs:complexType>

              <xs:complexContent>

         <xs:extension base="PublicationType">

               <xs:sequence>

                 <xs:element name="ISBN" type="xs:string"/>

                 <xs:element name="Publisher" type="xs:string"/>

            </xs:sequence>

         </xs:extension>

    </xs:complexContent>

 </xs:complexType>

   </xs:alternative>

   <xs:alternative type="xs:error"/>

</xs:element>

 

Es importante tener en cuenta que:

 

De todos los elementos secundarios alternative se selecciona el primero que dé como resultado true. Es decir, el orden de los elementos alternative es muy importante. Si desea reordenar los elementos alternative, simplemente seleccione uno de los recuadros y arrástrelo a su nueva posición.

El elemento Publication tiene un tipo (PublicationType). El tipo sirve de tipo predeterminado si no se usa ninguno de los elementos alternative. Sin embargo, en nuestro ejemplo se usará el elemento alternative de tipo xs:error si los dos elementos condicionales alternative anteriores devuelven el valor false.

Si no se cumple con ninguna condición de los elementos alternative y el elemento no tiene un tipo predeterminado, entonces se asigna al elemento el tipo anyType. En tal caso, el elemento puede tener cualquier contenido que tenga formato XML correcto.

El elemento alternative y el tipo simple xs:error son nuevos en la especificación XSD 1.1.

 

Edición de elementos alternative en la vista del modelo de contenido

En la vista del modelo de contenido puede añadir un tipo alternativo como secundario de una declaración de elemento con el menú contextual.

 

El tipo del elemento alternative se especifica en el ayudante de entrada Detalles. Si el tipo es un complexType, este aparece en el recuadro expandido del elemento alternative, donde se puede seguir editando (imagen siguiente). Los tipos simples no aparecen en el diagrama, pero se pueden definir en la pestaña SimpleType del ayudante de entrada Detalles.

CTABoxExpandedCTADetailsEH
Nota:en el ayudante de entrada Detalles puede especificar el espacio de nombres de la expresión XPath (en el atributo xpathDefaultNamespace). Para más información, siga leyendo.

 

 

 

Uso del atributo xpathDefaultNamespace

El espacio de nombres predeterminado declarado en el documento de esquema es el espacio de nombres predeterminado del documento de esquema. Afecta a los nombres de elemento sin prefijo del documento pero no a los nombres de elemento sin prefijo de las expresiones XPath del documento de esquema.

 

El atributo xpathDefaultNamespace es una característica nueva de la especificación XSD 1.1 y es el mecanismo utilizado para especificar el espacio de nombres al que pertenecen los nombres de elemento sin prefijo de las expresiones XPath.

 

El ámbito de los atributos xpathDefaultNamespace son los elementos del esquema XML en los que se decararon. El atributo xpathDefaultNamespace puede aparecer en estos elementos de XML Schema 1.1:

 

xs:schema

xs:assert y xs:assertion

xs:alternative

xs:selector y xs:field (en restricciones de identidad)

 

El atributo xpathDefaultNamespace de xs:schema se configura (en el modo XSD 1.1) en el cuadro de diálogo "Configuración del esquema" (Diseño de esquemas | Configuración del esquema). El atributo xpathDefaultNamespace de los demás elementos se configura en el ayudante de entrada Detalles de cada elemento (imagen siguiente).

AssertEHDetails02XPDNS

Al declararse el espacio de nombres predeterminado de la XPath en xs:schema, se declara el espacio de nombres predeterminado de la XPath para el ámbito de todo el esquema. Puede invalidar esta declaración en los elementos en los que se permite el atributo xpathDefaultNamespace (véase la lista anterior).

 

En lugar de incluir un espacio de nombres real, el atributo xpathDefaultNamespace incluye una de estas tres palabras clave:

 

##targetNamespace: el espacio de nombres predeterminado de la XPath será el mismo que el espacio de nombres de destino del esquema

##defaultNamespace: el espacio de nombres predeterminado de la XPath será el mismo que el espacio de nombres predeterminado del esquema

##local: sin espacio de nombres predeterminado de XPath

 

Si en el documento no se declara ningún espacio de nombres predeterminado de XPath, los elementos sin prefijo de las expresiones XPath no estarán en ningún espacio de nombres.

 

Nota:La declaración de espacio de nombres predeterminado de XPath no afecta a los atributos.

 

© 2018-2024 Altova GmbH