XSD 中的循环依赖有效吗?

Is a circular dependency in XSD valid?

我找到了各种资源,其中据说如果可以将其重写为没有循环依赖的 XSD,则可以有循环依赖。

我有两个文件

schemaA.xsd

<xs:include schemaLocation="schemaB.xsd"/>

schemaB.xsd

<xs:include schemaLocation="schemaA.xsd"/>

这显然是一个循环依赖,我无法理解这是如何解决的。然而,很少有在线验证者说它是有效的,也很少有人说它不是。如果是,请帮助我了解它是如何编译的。我要用的库无法编译。

有效。

我试图说服规范的编辑对此进行澄清,但他们声称已经非常清楚了。 (作为我自己的规范编辑,我已经慢慢学会接受如果 reader 说某事不清楚,那么根据定义,它就是。)

基本上是允许的,因为没有规定不允许。

在 XSD 1.1 规范中说:

如果一个·schema document·D1包含一个或多个元素,那么schema(D1)不仅包含immed(D1)而且还包含schema(D2)的所有组件), 对于每个由 D1 的 <include> 子元素标识的·模式文档· D2。

这是一个递归定义,作为程序员,您可能会想“如果它是一个循环定义会发生什么”。我从编辑那里得到的回应是:你不应该像程序员一样思考;或者,如果您是,那么处理周期是您的问题,而不是我们的问题。在数学图论中,即使关系不是非循环的,关系的传递闭包也是明确定义的;在不进入循环的情况下评估传递闭包是一个实现问题,而不是规范问题。

所以简而言之,规范所说的是模式包含通过一个或多个 xs:include 指令可以访问的所有内容,如果这些指令让你绕圈子,处理器只需要处理它。

你如何解决你的问题是另一个问题。一如既往,当面对有缺陷的产品时,您的选择是:

  • 提交错误报告并等待解决

  • 放弃使用该产品并改用替代产品

  • 避免使用不起作用的功能。