我有一个案例,我需要一个能够嵌套自己或有其他元素的元素。
这样的事情应该是有效的:
<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>
答案 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
元素(递归地)。