使子标签依赖于XML Schema中父级的属性

时间:2012-09-17 23:58:11

标签: xsd

我创建了一个XML文件,如下所示

  <monitor>
    <widget name="Widgets/TestWidget1">
        <state code="VIC" />
        <state code="TAS" />
    </widget>
    <widget name="Widgets/TestWidget2">
        <client code="someclient" />
    </widget>
  </monitor>

<widget>标记的name属性告诉解析器要加载哪个小部件(它们是asp.net用户控件)。

我正在尝试为上面创建一个模式文件,问题是<widget>内部支持的子标签依赖于name属性。因此,TestWidget1支持<state>标记,TestWidget2支持<client标记。

目前,我的XML Schema文件只显示所有可能的<widget>子标签,无论它们是否受支持。

如何编写一个只允许基于name属性的特定子标签的XML模式文件?如果这不可行,我有哪些选择?

1 个答案:

答案 0 :(得分:0)

您有几种选择。最简单和最直接的是重新思考你的问题。如果元素E1的合法内容和元素E2的合法内容不同,那么最简单的设计是将它们称为不同的东西,因为在XSD中,如在DTD中,元素的合法内容取决于元素类型名称。魔鬼的拥护者会问你&#34;如果你想让不同类型的小部件遵守不同的规则,你为什么要告诉验证者他们是同一种小部件?通过给他们不同的名字告诉验证者真相。所以不要打电话给他们,等等,打电话给他们。&#34;

在XSD 1.1中,您还可以使用条件类型赋值或断言来定义属性和子元素的合法组合的约束,但并非每个模式感知编辑器都具有分析条件类型赋值规则和属性所需的chops并了解提示你的内容。