2008-12-22 217 views
7

我想产生一个非常简单的XML模式类似以下内容的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间谍。

我该如何解决这个问题?

感谢, 达纳

+0

您能否发布您正在收到的确切错误消息以及您使用了哪些工具? – Tomalak 2008-12-22 15:03:17

回答

6

关于错误:该错误消息中提到的线路,这不是你包括XSD,但是这两条线在它是一把双刃剑:

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

最简单的例子来说明歧义是,如果只是有一个<important_tag>

<important_tag></important_tag> 

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

我读过下一个XML Schema版本,您可以说出您的意思:任何标签,但 important_tag除外。

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

7

没有谈到有关desigining扩展的模式,你可以找到here MSDN上一个伟大的文章,我建议你去通过这一切,而是专门给你点它解释了为什么”在“使用XML模式设计可版本化的XML格式”下可以找到这个错误(你可以搜索“非确定性”并直接到那里。)

基本上,一旦你有一个xs:any元素验证器不能假定任何关于其他兄弟元素的东西,所以 - 你可能有一个important_tag的定义,它不需要那些强制性的属性tes,所以这些元素无法验证

+0

And果园的文章在这里:http://www.xml.com/lpt/a/1329 – annakata 2008-12-22 16:08:24

+0

是的,谢谢;阅读这篇文章,并认为它非常好。 – 2008-12-22 16:13:17

1

随着您的需求(诸如“任何其他标签不必符合任何定义”),Schematron,这是基于规则(“这一定是真的”, “这一定是错误的”)可能是比W3C Schema更好的解决方案,它更“一切都必须如此”。