xml xsd

¿Cómo restringir el valor de un elemento XML usando xsi: escriba XSD?



(1)

Me gustaría validar los valores de texto de un elemento en función del valor del atributo. Por ejemplo

<Device xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Parameter xsi:type="xsd:unsignedInt">-100</Parameter> <Parameter xsi:type="xsd:boolean"></Parameter> <Parameter>hello</Parameter> </Device>

Tanto lo anterior debería fallar. Para booleano, no se debe aceptar nada excepto "verdadero" o "falso" (incluso una cadena vacía)

Mi xml es mucho más complejo con muchos nodos Object y Parameter y este es mi xsd que valida todos esos nodos de forma recursiva

<xs:complexType name="deviceType"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="Object"/> <xs:element ref="Parameter"/> </xs:choice> </xs:complexType> <xs:complexType name="objType"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="Object"/> <xs:element ref="Parameter"/> </xs:choice> <!-- Add all valid attributes for ''Object'' type here --> <xs:attribute name="Id" use="required"/> <xs:attribute name="Flag" use="required"/> <xs:anyAttribute processContents="lax"/> </xs:complexType> <xs:complexType name="paramType" mixed="true"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="Object"/> <xs:element ref="Parameter"/> </xs:choice> <xs:attribute name="Id" use="required"/> <xs:attribute name="Flag" use="required"/> <xs:anyAttribute processContents="lax"/> </xs:complexType>

Pero me enfrento a este error.

Type ''xsd:unsignedInt'' is not validly derived from the type definition, ''paramType'', of element ''Parameter''. Type ''xsd:unsignedInt'' is not validly derived from the type definition, ''paramType'', of element ''Parameter''.

¿Cómo puedo arreglar esto?


Para usar xsi:type su documento XML:

  1. Declare el prefijo de espacio de nombres xsi , generalmente en el elemento raíz:

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  2. Declare el prefijo de espacio de nombres xs (o xsd ), generalmente en el elemento raíz:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"

  3. Agregue cualquier tipo XSD al elemento que desea restringir:

    xsi:type="xs:boolean"

Estos cambios se realizan directamente en su documento XML. No tiene que hacer ningún cambio en su XSD. Sin embargo, el tipo elegido debe derivarse válidamente del tipo proporcionado por el XSD para el elemento dado .

Referencias relevantes del W3C

Del esquema XML, parte 1: Estructuras, segunda edición ...

2.6.1 xsi: tipo

La definición de tipo simple (§2.2.1.2) o la definición de tipo complejo (§2.2.1.3) utilizada en la ·validation· de un elemento generalmente se determina por referencia a los componentes de esquema apropiados. Sin embargo, un elemento de información de elemento en una instancia puede afirmar explícitamente su tipo utilizando el atributo xsi:type . El valor de este atributo es un ·QName· ; vea la Interpretación de QName (§3.15.3) para conocer los medios por los cuales el ·QName· se asocia con una definición de tipo.

[...]

Regla de validación: Elemento localmente válido (Elemento)

4.3 La · definición de tipo local · debe derivarse válidamente de la {definición de tipo} dada la unión de las {sustituciones no permitidas} y las { sustituciones prohibidas} de {definición de tipo } , como se define en Derivación de tipo OK (Complejo) (§ 3.4.6) (si es una definición de tipo compleja), o se le dan {sustituciones no permitidas} como se define en Tipo de derivación OK (Simple) (§3.14.6) (si es una definición de tipo simple).

Del esquema XML Parte 2: Tipos de datos Segunda edición ...

3 tipos de datos incorporados