不明确的XML模式

不明确的XML模式,xml,xsd,ambiguity,Xml,Xsd,Ambiguity,我正在尝试为类似以下内容的XML生成一个非常简单的XML模式: <messages> <item> <important_tag></important_tag> </item> <item> <important_tag></important_tag> <tag2></tag2> </item> <item>

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

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

其思想是,
将有一个特定的定义,它可能出现在
下,也可能不出现。它也可能出现不止一次。 此外,在
之前或之后可能还有其他我无法预先命名的标记

我想给出
的具体定义。例如,定义它必须包含的属性。 我的意思是如果出现了重要标签,它必须符合我的定义。任何其他标记都不必符合任何定义

我尝试使用以下方案:

<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.
cos nonambig:“”使内容模型对“”不确定。可能原因:名称相等、重复出现或替换组。
我正在使用Altova的XML Spy

我如何解决这个问题

谢谢,
Dana

在MSDN上有一篇关于设计可扩展模式的文章,您可以找到,我建议您通读所有内容,但具体到您的观点,它解释了为什么在第2点中会出现此错误。在“使用XML模式设计可版本化的XML格式”下(您可以搜索“非确定性”并直接访问)


基本上,一旦您有了xs:any元素,验证器就不能对其他同级元素做任何假设,因此-您很可能有一个重要标记的定义,它不需要那些强制属性,因此这些元素无法根据您的要求进行验证(例如“任何其他标记都不必符合任何定义。”),它基于规则(“this must's true”,“that must's false”),可能是比W3C模式更好的解决方案,W3C模式更“一切都必须如此”“

关于错误:该错误消息提到一行不在您包含的xsd中,但其中的这两行不明确:

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

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


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

我已经读到,下一个版本的XMLSchema允许您说出您的意思:除了重要的标记之外的任何标记


以两种不同的方式匹配XML类似于正则表达式“a*a*”以两种不同的方式匹配“a”(第一种方式是“a”;第二种方式是“a”)。在DTD的XML规范中,这种模糊性过去被称为“非确定性”,但XML模式规范称之为唯一粒子属性规则(UPA),这意味着您应该能够知道模式的哪一部分获取XML文档的每一部分。

您可以发布您获取的确切错误消息以及您使用的工具吗?您是对的,这正是问题所在。我通过“更改规则”克服了它,即强制实施更严格的模式。感谢您在标记名上的注释-也更改了:)
  <important_tag></important_tag>