7

我正在尝试为类似于以下内容的 XML 生成一个非常简单的 XML 模式:

<messages>
  <item>
    <important_tag></important_tag>
  </item>
  <item>
    <important_tag></important_tag>
    <tag2></tag2>
  </item>
  <item>
    <tag2></tag2>
    <tag3></tag3>
  </item>
</messages>

这个想法是<important_tag>会有一个特定的定义,它可能会或可能不会出现在<item>. 它也可能出现不止一次。此外,之前或之后可能还有其他标签<important_tag>,我无法提前命名。

我想给出一个具体的定义<important_tag>。例如,定义它必须包含的属性。我的意思是,如果important_tag 存在,它必须符合我的定义。任何其他标签不必符合任何定义。

我尝试使用以下方案:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="messages">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="item" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="item">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="important_tag" minOccurs="0"/>
        <xs:any minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="important_tag">
    <xs:complexType>
      <xs:simpleContent>
        ... specific definitions for important_tag ...
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

这会导致错误提示架构不明确。

确切的错误信息是:

cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups.

我正在使用 Altova 的 XML Spy。

我该如何解决这个问题?

谢谢,达娜

4

3 回答 3

7

MSDN 上有一篇很棒的文章讨论了设计可扩展模式,你可以在这里找到,我建议你通读一遍,但具体到你的观点,它解释了为什么你在第 2 点遇到这个错误。在“使用 XML Schema to Design a Versionable XML Format”(您可以搜索“non-deterministic”并直接到达那里。

基本上,一旦你有一个 xs:any 元素,验证器就不能假设其他兄弟元素的任何事情,所以 - 你很可能有一个重要的标签定义,它不需要那些强制属性,所以这些元素不能被验证

于 2008-12-22T15:45:01.130 回答
6

关于错误:该错误消息提到了您包含的 xsd 中没有的一行,但是其中的这两行是模棱两可的:

<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>

显示歧义的最简单示例是如果只有一个<important_tag>

  <important_tag></important_tag>

问题是它可以被解释为一个“important_tag”和零个“any”标签(这是你想要的),但它也可以被解释为零个“important_tag”和一个“any”标签。这是因为“any”标签可以匹配任何标签,包括“important_tag”。

我读到下一个版本的 XML Schema 可以让您说出您的意思:重要标签之外的任何标签。

以两种不同方式匹配 XML 类似于以两种不同方式匹配“a”的正则表达式“a*a*”(第一个“a”;或第二个“a”)。在 DTD 的 XML 规范中,这种歧义曾经被称为“非确定性”,但 XML Schema 规范将其称为唯一粒子属性规则 (UPA),这意味着您应该能够分辨出架构的哪个部分获取每个部分的 XML 文档。

于 2009-01-02T17:52:45.050 回答
1

根据您的要求(例如“任何其他标签不必符合任何定义。”),基于规则(“这必须是真的”、“那必须是假的”)的Schematron可能会更好解决方案比 W3C Schema 更“一切都必须如此”。

于 2008-12-22T15:48:58.017 回答