通过 XSD 限制基于另一个元素的 XML 元素

Posted

技术标签:

【中文标题】通过 XSD 限制基于另一个元素的 XML 元素【英文标题】:Restricting XML Elements Based on Another Element via XSD 【发布时间】:2011-05-06 20:00:47 【问题描述】:

我相信这与keyref 有关,但我不确定,我真的不确定它是否可以做到。

例如,假设我有 myElement1 和 myElement2。如果 XML 文件中没有 myElement2,那么 myElement1 必须存在,否则是可选的。

有没有办法在我的 XSD 文件中强制进行这种类型的验证?

【问题讨论】:

我很确定答案不是因为模棱两可:此类元素容器的架构将有两个不同的定义。唯一的解决方案是将“可选/必需”元素声明为可选并使用第二阶段验证。 【参考方案1】:

类似的问题已经在 *** 或任何技术博客中被问过多次......

但答案总是不可能

像这样的情况:

(a) 根据任何其他元素/属性的值或存在来验证元素 (b) 根据任何其他元素/属性的值或存在来验证元素的值 (c) 根据任何其他元素/属性的值或存在来验证属性 (d) 在同一范围内定义具有不同类型/数据类型的同名元素/属性 (e) 根据任何其他元素/属性的值或存在来验证子元素

上述所有情况都不可能实现..

但是如果你能实现一些转换的东西..那么你可以得到帮助。 我的意思是“首先根据您的要求进行转换并修改XML,

example :: 如果期望特定字段具有某个值 .. 如果满足条件,则按原样传递 XML,如果不满足,则不传递 .. 在下一个块中,XSD 将进行验证,并且显然会出错 :) 您可以发现它缺少您的自定义验证..

无论如何,目的是根据数据阻止传递 xml ..这就是您正在做的事情..

注意:Schematron 最近已经开始使用了!教程如下:http://zvon.org/xxl/SchematronTutorial/General/contents.html

【讨论】:

感谢您的信息!我在发布之前进行了搜索,但无法真正找到答案。基本上,我发现仅使用验证和架构是不可能的。 这是对 XSD 1.0 中情况的合理但不完全准确的解释:情况 (a)、(b)、(e) 和 (f) 有时是可能的,具体取决于所需的约束。在 XSD 1.1 中,条件类型和断言特性使得可以表达的约束范围更广。 @CMSperberg-McQueen,据我了解.. 在 XSD 1.0 a,b,e,f 中是不可能实现的(如果您有 choice 在您的脑海中,那么它有自己的限制)。如果您知道 a、b、e、f 的示例,请提供我有兴趣知道(正如您有时所说,我对程度感到好奇)谢谢您提供宝贵的 cmets clause (e): 你不能在同一层次结构下拥有相同名称和不同类型的元素/属性!虽然它可以出现在不同的层次结构中,具有不同的 complexType 或 simpleType 或只是类型..(在这种情况下,这些元素/属性被视为两个独立但不相同的元素) @InfantPro'Aravind' - 情况 (a)、(b)、(c) 和 (f) 都包括对另一个元素的 存在 的可能依赖关系,如以及它的价值。但是当且仅当元素 Y 存在时,内容模型使元素 X 很容易成为必需(或可选,或合法):模型(Y, X)?(例如)在 Y 存在时使子 X 成为必需,否则非法。本地绑定使元素的类型不仅依赖于其父元素,而且依赖于任何祖先。 XSD 1.0 不支持这些类型对元素values 的依赖,但元素的presence 是另一回事。【参考方案2】:

我的建议是为下面定义的每个案例创建 XSD:

这样的案例:

    根据任何其他元素/属性的值或存在来验证元素。 根据任何其他元素/属性的值或存在来验证元素的值。 根据任何其他元素/属性的值或存在来验证属性。 不允许从验证中忽略(随机)元素/属性。 (我的意思是有限制的使用。) 具有不同数据类型的同名元素/属性。 根据任何其他元素/属性的值或存在来验证子元素。

并为此创建自己的 XML。

【讨论】:

以上是关于通过 XSD 限制基于另一个元素的 XML 元素的主要内容,如果未能解决你的问题,请参考以下文章

可以根据XSD中的属性值限制元素的出现次数吗?

如何使用混合值(整数和字符串)限制更改XML / XSD中的complexType?

XSD - 如何使一个元素包含 CDATA 标签?

XSD:如何重新定义基本模式的标签

使用 XSD 1.1 的动态枚举限制

JDOM2、xmlns (xsd) 不能从 XML 文档中更改或删除