是否可以为递归的,未知命名的元素定义XML Schema? 例如:
<Bob age="72">
<FavoriteColor>"Blue"</FavoriteColor>
<Children>
<Sally age="36">
<FavoriteColor>"Green"</FavoriteColor>
<Children />
</Sally>
<Joe age="34">
<FavoriteColor>"Red"</FavoriteColor>
<Children>
<Tina age="5">
<FavoriteColor>"Blue"</FavoriteColor>
<Children />
</Tina>
<Frank age="6">
<FavoriteColor>"Yellow"</FavoriteColor>
<Children />
</Frank>
</Children>
</Joe>
</Children>
</Bob>
我对XSD很新,但我认为这需要一些递归和<xs:any>
的组合。
请参阅: Recursion in an XML schema?和 how can I define an xsd file that allows unknown (wildcard) elements?
但是我找不到一个不涉及用更严格的形式重写隐含的Person
元素的解决方案:
<Person name="Bob" age="72">
<FavoriteColor />
<Children />
原始的XML Schema能够吗?
答案 0 :(得分:2)
您已正确识别xsd:any
作为允许Children
下任何元素的解决方案,并且您已正确识别用于表示类似家族树结构的递归类型模式。
但是,xsd:any
不能完成它所管理的元素的部分约束任务。使用xsd:any
后,您将无法控制该点下方的标记。它唯一的选择涉及有效性如何受到遇到元素定义的影响;见processContents strict vs lax vs skip for xsd:any。
试图让第一个例子工作将是一场艰苦的战斗。 (你可以在XSD 1.1中使用断言,但是你会不自然地强迫断言去完成通过简单内容模型完成的工作。)使用第二种形式;它是更好的XML设计。