如何为递归和未知命名元素定义 XML 模式?

How to define an XML Schema for recursive and unknown-named elements?

是否可以为递归的未知命名元素定义 XML 架构? 例如:

<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 架构可用吗?

您已正确识别 xsd:any 作为允许 Children 下的任何元素的解决方案,并且您已正确识别表示类家谱结构的递归类型模式。

然而,xsd:any不能胜任对其管辖的元素进行部分约束的任务。使用 xsd:any 后,您将失去对该点下方标记的控制。它的唯一选项涉及有效性如何受所遇到元素的定义的影响;参见 processContents strict vs lax vs skip for xsd:any

尝试使第一个示例工作将是一场艰苦的战斗。 (您可以在 XSD 1.1 中使用断言,但您会不自然地强制断言执行旨在通过简单内容模型完成的操作。)使用第二种形式;更好的 XML 设计。