我有以下 XML:
<root>
<someNode>
<someChild attr="val" />
</someNode>
<otherNode>
<otherChild>
<otherSubChild />
</otherChild>
</otherNode>
</root>
一个有效的 XML Schema 将非常容易。现在的问题是,我的程序必须支持在解析文件时评估的特殊元素,并导致元素的条件替换。
例子:
<root>
<someNode>
<if environment="DEV">
<someChild attr="val" />
</if>
<if environment="PROD">
<someChild attr="otherVal" />
</if>
</someNode>
<otherNode>
<otherChild>
<if environment="DEV">
<otherSubChild />
</if>
</otherChild>
</otherNode>
</root>
我想你应该已经明白了。问题是,if
允许元素出现在 XML 中的任何地方,但同时允许包含允许放入元素的任何元素。
我将如何以一种好的方式定义它?目前,我的 XML 模式中有大约 90 种类型/元素,手动编辑每个类型/元素以允许if
允许正确子元素的元素真的很麻烦。
是否可以制作一个允许上述if
元素的架构?
因此,您已经指定了内容模型的层次结构,具体说明了哪些元素可以出现在哪些其他元素中,以多少数量以及可能以什么顺序出现。现在您要添加,顺便说一句,一个if
元素可以在任何地方包装任何现有元素?
你不能在 XSD 中做到这一点。如果不修改这些特定指令,或者没有预先为这种可能性做出规定,您就无法以这种方式在全局范围内反击所有特定约束。(例如,如果您定义了一个元素替换组,它可能会出现在整个文档的多个位置,您可以轻松地向该组添加一个新成员。)
有一种说法可以说任何元素都可以出现在内容模型 ( xs:any
)中的给定位置,但没有办法说给定元素可以出现在所有内容模型中的任何地方。在 XSD 1.1 中,有一种新机制允许在内容模型中开放内容,但这也允许前瞻性规定,而不是追溯全局调整。
一个建议可能是在 XML 的有如果和无如果形式之间编写一个简单的 XSLT 转换,并分别验证这些文档。
另一种方法是将您的条件表示为将出现在任何元素上的属性,而不是可以包装任何其他元素的元素。这仍然需要对 XSD 进行更新,但在保留现有内容模型的同时进行更新会更容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句