2016-05-02 3 views
0

У меня есть XML, который может иметь 2 типа узлов, как указано ниже:XSD Условный дочерний элемент на основе атрибута

Тип 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> 

Тип 2:

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

Если значение attr1 является ложным, то оно будет иметь вспомогательные узлы, и нет attr3, attr4 будет

Если значение attr1 истинно, то у него не будет никаких узлов, и attr3, attr4 будет там.

ответ

0

Вы можете сделать это с помощью утверждает в XSD 1.1, но я не могу видеть, как сделать это в 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> 
Смежные вопросы