2017-09-28 4 views
1

Ce poste est une extension du poste: Restrict the attribute value and the value of the element using XSDLimiter la valeur d'attribut de requête XML et peu de la valeur de l'élément

Maintenant, je suis en mesure de limiter toute la valeur de l'élément attribut & utilisant le XSD. Mais je cherche maintenant à restreindre seulement un ou deux de la valeur d'élément et pas tous.

XML:

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER">di.js</resp> 
    <resp name="BI">bi.j</resp> 
</response> 

XSD:

<xs:schema attributeFormDefault="unqualified" 
      elementFormDefault="qualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="response"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="resp" maxOccurs="14" minOccurs="1"> 
        <xs:complexType> 
         <xs:simpleContent> 
          <xs:extension base="respFilter"> 
           <xs:attribute name="name" use="required" 
               type="Enum" /> 
          </xs:extension> 
         </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="src" use="required"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:enumeration value="XML"></xs:enumeration> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    <xs:simpleType name="Enum"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="JSON"> 
      </xs:enumeration> 
      <xs:enumeration value="SWAGGER"> 
      </xs:enumeration> 
      <xs:enumeration value="BI"> 
      </xs:enumeration> 
     </xs:restriction> 
    </xs:simpleType> 
    <xs:simpleType name="respFilter"> 
     <xs:restriction base="xs:string"> 
      <xs:minLength value="0"></xs:minLength> 
      <xs:maxLength value="1064"></xs:maxLength> 
      <xs:enumeration value="letter.c"/> 
      <xs:enumeration value="di.js"/> 
      <xs:enumeration value="bi.j"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

Cette XSD ne permet que la requête XML ci-dessus si elle a la valeur ci-dessous il:

Mais ce que je Je cherche à faire maintenant est de permettre dynamiquement peu de valeurs d'éléments afin que le XSD valide toutes les demandes ci-dessous.

1.

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER"></resp> 
    <resp name="BI">bi.j</resp> 
</response> 

2.

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER">23.x</resp> 
    <resp name="BI">bi.j</resp> 
</response> 

3.

<response src="XML"> 
    <resp name="JSON">letter.c</resp> 
    <resp name="SWAGGER">di.js</resp> 
    <resp name="BI">dj.c</resp> 
</response> 

Donc, fondamentalement, attribuer JSON aura toujours letter.c, autre chose que dans letter.c JSON devrait être jeté par le XSD. D'autre part, l'attribut SWAGGER & BI peut avoir une valeur quelconque ou vide.

+0

Même sans comprendre parfaitement ce que vous essayez de faire, vous aurez besoin de XSD 1.1 pour votre type de validation. (1) Est-ce une option? (2) Vos exigences ne sont pas claires: Au minimum, expliquez * tout autre que letter.c dans JSON devrait être rejeté par le XSD *. Réalisez que XSD est pour * validation *, il ne * rejette * rien. – kjhughes

+0

1. XSD 1.1 n'est pas une option ici. 2. Je voulais dire que si quelque chose en dehors de letter.c vient en valeur dans JSON, il ne devrait pas être validé par le XSD. Jeté le mauvais mot que j'ai utilisé. – Sierra

Répondre

0

Pour que la validation varie en fonction de la valeur de @name, vous devez disposer d'assertions ou d'une affectation de type conditionnelle à partir de XSD 1.1. Si vous êtes limité à XSD 1.0, vous devrez tester votre contrainte hors bande par rapport à XSD, ou vous devrez redessiner votre XML pour la rendre moins meta:

<response src="XML"> 
    <JSON>letter.c</JSON> 
    <SWAGGER>di.js</SWAGGER> 
    <BI>bi.j</BI> 
</response> 

Cette XML peut utiliser une valeur fixe pour JSON et des énumérations pour SWAGGER et BI dans XSD 1.0.