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 的 <include>
子元素标识。
这是一个递归定义,作为程序员,您可能会想“如果它是一个循环定义会发生什么”。我从编辑那里得到的回应是:你不应该像程序员一样思考;或者,如果您是,那么处理周期是您的问题,而不是我们的问题。在数学图论中,关系的传递闭包是明确定义的,即使关系不是无环的;在不进入循环的情况下评估传递闭包是一个实现问题,而不是规范问题。
简而言之,规范所说的是,架构包含可通过一个或多个 xs:include
指令访问的所有内容,如果这些指令让您绕圈子,处理器只需处理它。
如何解决问题是另一个问题。与往常一样,当面对有缺陷的产品时,您的选择是:
提交错误报告并等待解决
放弃使用该产品并改用替代产品
避免使用不起作用的功能。
【讨论】:
以上是关于XSD 中的循环依赖是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章