XSD 中的循环依赖是不是有效?

Posted

技术标签:

【中文标题】XSD 中的循环依赖是不是有效?【英文标题】:Is a circular dependency in XSD valid?XSD 中的循环依赖是否有效? 【发布时间】:2021-12-27 12:24:09 【问题描述】:

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

我有两个文件

schemaA.xsd

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

schemaB.xsd

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

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

【问题讨论】:

【参考方案1】:

有效。

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

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

在 XSD 1.1 中,规范说:

如果一个·schema 文档· D1 包含一个或多个元素,则 schema(D1) 不仅包含immed(D1),而且还包含 schema(D2) 的所有组件,对于每个·schema 文档· D2 由 D1 的 &lt;include&gt; 子元素标识。

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

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

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

提交错误报告并等待解决

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

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

【讨论】:

以上是关于XSD 中的循环依赖是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

构建非循环依赖关系的最简单和最有效的数据结构是啥?

浅谈Spring中的循环依赖

MyBatis工作原理及循环依赖

Spring 循环依赖原理源码的探究和总结以及三级缓存的详解一万字

Spring循环依赖

spring中的循环依赖