2015-02-27 6 views
1

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

Что-то подобное должно быть действительным:

<root> 
    <rule condition="..."> 
    <rule condition="..."> 
     <setting>...</setting> 
    </rule> 
    </rule> 
    <rule condition="..."> 
    <setting>...</setting> 
    </rule> 
</root> 

Но это должно не быть действительным:

<root> 
    <rule condition="..."> 
    <rule condition="..."> 
     <setting>...</setting> 
    </rule> 
    <setting>...</setting> 
    <setting>...</setting> 
    </rule> 
</root> 

Если я понимаю правильно XSD это должен делать эту работу, но это не делает , Что я делаю не так?

<xs:complexType name="RuleType"> 
    <xs:choice> 
     <xs:element name="rule" minOccurs="1" 
        maxOccurs="unbounded" type="RuleType" /> 
     <xs:element name="setting" minOccurs="1" 
        maxOccurs="unbounded" type="xs:string" /> 
    </xs:choice> 
    <xs:attribute name="condition" type="xs:string" use="required"/> 
</xs:complexType> 

ответ

1

Это XSD позволит ваш первый пример XML, но не ваш второй:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="rule" type="RuleType"/> 

    <xs:complexType name="RuleType"> 
    <xs:choice> 
     <xs:element name="setting" minOccurs="1" maxOccurs="unbounded" /> 
     <xs:element ref="rule" minOccurs="1" maxOccurs="unbounded" /> 
    </xs:choice> 
    <xs:attribute name="condition" use="required"/> 
    </xs:complexType> 

</xs:schema> 

Прочитайте XSD так:Каждый rule может состоять из одного или нескольких элементов setting или одного или нескольких других элементов rule (рекурсивно).