微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何允许XML元素通过XSD出现在任何地方?

我有以下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中这样做.在不修改这些特定指令的情况下,或者没有先验地规定这种可能性的情况下,您无法以这种方式全局抵消所有特定约束. (例如,如果您定义了一个可能在整个文档中出现多个位置的element substitution group,则可以轻松地向该组添加新成员.)

有一种方法可以说任何元素都可以出现在内容模型中的给定位置(xs:any),但是没有办法说给定元素可以出现在所有内容模型中的任何位置.在XSD 1.1中,有一种新的机制可以在内容模型中允许open content,但这也允许前瞻性规定,而不是追溯性的全局调整.

一个建议可能是在XML的with-if和without-if形式之间编写一个简单的XSLT转换,并单独验证这些文档.

另一种方法是将您的条件表示为将出现在任何元素上的属性,而不是可以包装任何其他元素的元素.这仍然需要更新您的XSD,但在保留现有内容模型的同时更容易进行更新.

原文地址:https://www.jb51.cc/xml/293057.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。