XML 是否需要针对 XSD 进行严格验证?如何在 XSD 中验证基于条件的 XML?
我有一个需要验证条件的场景。在做了一些研究之后,我发现 XSD 1.0 不会进行基于条件的验证。
示例:基于属性“Y”或“N”,我必须显示不同的元素。
请提供任何建议。
考虑以下设计:在我们的A
元素内部,我们有一个frob
值为“Y”或值为“N”的属性。如果frob='Y'
, 则A
必须包含B
, C
, 和零个或多个D
; 如果frob='N'
, 那么 的内容A
是X
, Y
, Z
. 正如您所说,XSD 1.0 无法强制frob
属性与A
.
现在考虑以下设计:A
元素包含B
和C
后跟零次或多次出现D
, 或X
, Y
, 和Z
按此顺序。XSD 1.0 可以很简单地表达这种设计。
对于第一个设计正确的每个 XML 实例,都有一个对应第二个设计正确的对应实例,反之亦然。换句话说,这两种设计包含完全相同的信息。
在这种情况下,我的建议是问自己为什么要使用冗余frob
属性,因为它没有传达内容尚未传达的有用信息A
。
不,XML 不必针对 XSD 进行验证。
XSD 1.0 无法对您的数据实施任意约束。如果您有无法使用 XSD 1.0 强制执行的约束,您有多种选择:重新设计 XML,迁移到 XSD 1.1,使用不同的技术验证它(包括编写您自己的自定义验证器的选项,比如在 XSLT 中),或根本不验证它。