2016-05-02 17 views
0

Ich habe eine xml, die zwei Typen von Knoten haben können, wie unten erwähnt:XSD Conditional Child Element basierend auf Attribut

Typ 1:

<node attr1="false" attr2="attr2"> 
    <node attr1="true" attr2="attr2" attr3="attr3" attr4=""></node> 
</node> 

<node attr1="false" attr2="attr2"> 
<node attr1="false" attr2="attr2"> 
    <node attr1="true" attr2="attr2" attr3="attr3" attr4=""> 
</node> 
</node> 
<node attr1="true" attr2="attr2" attr3="attr3" attr4=""></node> 

Typ 2:

<node attr1="true" attr2="attr2" attr3="attr3" attr4=""></node> 

Wenn attr1 Wert ist falsch, dann wird es Unterknoten haben, und kein attr3, attr4 wird dort sein

Wenn attr1 Wert ist wahr, dann wird es keine Unterknoten haben, und attr3, attr4 wird da sein.

Antwort

0

Sie können dies tun mit behauptet in XSD 1.1, aber ich kann nicht einen Weg, es zu tun in XSD 1,0

Graphical representation of XSD schema using Liquid XML Studio

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML 2017 Developer Bundle Edition 15.0.0.0 (https://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="node"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="node" minOccurs="0" maxOccurs="unbounded" /> 
      </xs:sequence> 
      <xs:attribute name="attr1" type="xs:boolean" use="required" /> 
      <xs:attribute name="attr2" type="xs:string" use="required" /> 
      <xs:attribute name="attr3" type="xs:string" /> 
      <xs:attribute name="attr4" type="xs:string" /> 
      <xs:assert test="string(@attr1) = ('false', '0') or boolean(@attr3)" /> 
      <xs:assert test="string(@attr1) = ('false', '0') or boolean(@attr4)" /> 
      <xs:assert test="string(@attr1) = ('true', '1') or not(boolean(@attr3))" /> 
      <xs:assert test="string(@attr1) = ('true', '1') or not(boolean(@attr4))" /> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
sehen