XSD用于递归元素定义

时间:2015-02-27 21:59:26

标签: xml 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 个答案:

答案 0 :(得分: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元素(递归地)。