我有以下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元素可以将任何现有元素包装在任何地方吗?
原文链接:https://www.f2er.com/xml/293057.html你不能在XSD中这样做.在不修改这些特定指令的情况下,或者没有先验地规定这种可能性的情况下,您无法以这种方式全局抵消所有特定约束. (例如,如果您定义了一个可能在整个文档中出现多个位置的element substitution group,则可以轻松地向该组添加新成员.)
有一种方法可以说任何元素都可以出现在内容模型中的给定位置(xs:any),但是没有办法说给定元素可以出现在所有内容模型中的任何位置.在XSD 1.1中,有一种新的机制可以在内容模型中允许open content,但这也允许前瞻性规定,而不是追溯性的全局调整.
一个建议可能是在XML的with-if和without-if形式之间编写一个简单的XSLT转换,并单独验证这些文档.
另一种方法是将您的条件表示为将出现在任何元素上的属性,而不是可以包装任何其他元素的元素.这仍然需要更新您的XSD,但在保留现有内容模型的同时更容易进行更新.