0

我有一个通过 XML 传输的对象层次结构。通过说明哪个元素可能包含哪些子元素,层次结构规则很容易在 XML Schema 中表达。XML 数据的简化示例是(实际对象数据包含在属性中,为简洁起见省略):

<root>
  <channel>
    <router>
      <message />
      <message />
      <message />
    </router>
    <router>
      <message />
      <message />
    </router>
  </channel>
  <channel></channel>
</root>

现在我想介绍“文件夹”,即仅用于构造长子列表以便于使用的节点。如果我创建一个通用<folder>元素,它不会强加自己的规则,而是从树上的下一个非文件夹元素继承它们。

在我看来,我无法在 XSD 中表达这一点,或者我可以吗?

我可以考虑替代方案,例如为每个可能的规则(丑陋)设置特定的文件夹元素,简单地忽略 XSD 中的规则并在代码中强制执行它们(对我来说很好)或以某种方式分离 XML 中的对象层次结构和中间节点(不太确定如何)。如果您有任何意见,我也将不胜感激。

4

1 回答 1

1

你是对的,你想要的东西不能用 XSD 表达。不过,可以引入单级文件夹,或者更一般地说,引入 n 级文件夹,但不能引入任意递归文件夹(因为这些必须是全局元素,然后它们不知道它们包含在)。

可以在Schematron表达这样的约束;反过来,可以将 schematron 约束嵌入到 XSD appinfo 元素中。您的验证器可能支持也可能不支持嵌入在 XSD 中的 Schematron。

于 2009-06-22T05:28:34.797 回答