2017-09-12 2 views
2

J'ai un XML générique qui doit être validé en utilisant un schéma XSD. Malheureusement, la structure du fichier XML est fixe et ne peut pas être modifiée.Est-il possible de vérifier ou de valider la valeur d'un nœud xml en utilisant xsd 1.1, à l'aide de assert et xpath?

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="RatingRequestShema-V2.xsd"> 
    <Request> 
    <Props id="Info"> 
     <Prop id="A" type="DATETIME">2017-10-01T09:34:11Z</Prop> 
     <Prop id="B" type="ENUM">Test</Prop> 
    </Props> 
    <Props id="Example"> 
     <Prop id="C" type="DATE">1980-08-14</Prop> 
     <Prop id="D" type="DECIMAL">34,5</Prop> 
    </Props> 
    </Request> 
</Root> 

XSD-schéma:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1"> 
<xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Request"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="Props" maxOccurs="unbounded"> 
          <xs:complexType> 
           <xs:sequence> 
            <xs:element name="Prop" maxOccurs="unbounded"> 
             <xs:complexType> 
                <xs:attribute name="id" use="required"/> 
                <xs:attribute name="type" use="required"/> 
                <xs:assert test="if (@id eq 'A') then @type eq 'DATETIME' 
              else if (@id eq 'B') then @type eq 'ENUM' else false()"/> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
           <xs:attribute name="id" use="required"> 
            <xs:simpleType> 
             <xs:restriction base="xs:string"> 
              <xs:enumeration value="Info"/> 
              <xs:enumeration value="Example"/> 
             </xs:restriction> 
            </xs:simpleType> 
           </xs:attribute> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 
<xs:simpleType name="datetime"> 
    <xs:restriction base="xs:dateTime"/> 
</xs:simpleType> 
<xs:simpleType name="B_Enum"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Test_1"/> 
     <xs:enumeration value="Test_2"/> 
     <xs:enumeration value="Test_3"/> 
    </xs:restriction> 
</xs:simpleType> 

Le XSD-schéma vérifie maintenant seulement que si l'identifiant est égal à "A" le type doit être " DATETIME "mais il doit également vérifier si la valeur" 2017-10-01T09: 34: 11Z "est de type xs: dateTime. La même chose s'applique pour les autres éléments.

Donc, le but est de vérifier que pour un certain id que un type et seulement un xs: simpleType est valide. Avec mon expression actuelle xs: assert, je peux seulement vérifier si un élément Prop a un attribut id et type spécifique. Mais j'ai aussi besoin de vérifier la valeur.

Merci, Joe

Répondre

1

Vous ne dites pas explicitement ce que votre question. Je suppose que la question est "comment puis-je vérifier que la valeur est du bon type?"

Une façon serait de mettre une affirmation supplémentaire sur la déclaration de Prop de la forme générale

if (@type = 'DATETIME') then . castable as xs:dateTime 
else ... 

Une approche peut-être plus simple serait d'utiliser l'affectation de type conditionnelle pour affecter le type approprié à Prop.