Comment restreindre la valeur D'un élément XML en utilisant xsi:type dans XSD?

j'aimerais valider les valeurs textuelles d'un élément en fonction d'une valeur d'attribut. Par exemple

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

les deux doivent échouer. Pour booléen, rien ne devrait être accepté sauf "true" ou " false "(même chaîne vide)

mon xml est beaucoup plus complexe avec le lot de noeuds Object et Parameter et c'est mon xsd qui valide tous ces noeuds de façon récursive

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

mais je fais face à cette erreur.

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

Comment puis-je réparer ça?

2
demandé sur tez 2015-11-19 19:04:29

1 réponses

pour utiliser xsi:type dans votre document XML:

  1. déclarez le préfixe xsi de l'espace de noms, habituellement sur l'élément racine:

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
  2. déclarez le préfixe xs (ou xsd ) de l'espace de nom, habituellement sur l'élément racine:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    
  3. ajouter n'importe quel type XSD à l'élément que vous voulez contraindre:

    xsi:type="xs:boolean"
    

ces modifications sont apportées directement dans votre document XML. Vous n'avez pas à modifier votre XSD. Toutefois, le type choisi doit être valablement dérivé du type fourni par le XSD pour l'élément donné .


références pertinentes du W3C

à Partir de XML Schema Partie 1: les Structures Deuxième Édition ...

2.6.1 xsi: type

la définition de type simple (§2.2.1.2) ou définition de type complexe (§2.2.1.3) utilisé dans ·validation· d'un élément est généralement déterminé par référence aux composantes appropriées du schéma. Un élément élément d'information dans un cas, cependant, peut explicitement affirmer son type en utilisant l'attribut xsi:type . La valeur de cette l'attribut est un ·QName· ; voir QName Interprétation (§3.15.3) pour le moyen par lequel le ·QName· est associé à un type définition.

[...]

Règle De Validation: Elément Localement Valide (Element)

4.3 la ·définition de type local· doit être valablement dérivée de la {définition de type} étant donné l'union de la {rejetée les substitutions} et le {définition de type} 's {interdite substitutions} , tel que défini dans la dérivation de Type OK (complexe) (§3.4.6) (s'il s'agit d'une définition de type complexe), ou donné {substitutions non autorisées} telles que définies dans la dérivation de Type OK (Simple) (§3.14.6) (s'il s'agit d'une définition de type simple).

From XML Schema Part 2: Datatypes Second Edition ...

3 types de données intégrées

enter image description here

6
répondu kjhughes 2015-11-20 14:41:42