2011-01-13 81 views
0

我是XML和XSD的新手,我有一个关于XML-Schema验证的问题。考虑XML文件:在XSD模式中为不同类型的元素指定唯一属性

<RequestList> 
    <Request1 id="1">...</Request1> 
    <Request2 id="2">...</Request2> 
    . 
    . 
    . 
</RequestList> 

我想迫使id属性是唯一的。 Google为我提供了很多帮助,以防元素具有相同的类型。但是我不能创建一个sinlge元素的'Request'序列,因为每个请求可以包含不同的信息,根据他的类型。我该怎么办? 在此先感谢您的帮助。

回答

1

XML规范定义了一个唯一的ID类型:

有效性约束:ID

值类型ID必须 生产人姓名相符。在XML文档中,名称不得多次出现 ,作为此类型的 值;即ID值 必须唯一标识承载它们的元素 。

的名称生产

[5]  Name ::=  (Letter | '_' | ':') (NameChar)* 

这就是说,如果一个属性被声明为ID类型的(不论是在DTD或XMLSchema的),那么验证必须确保它是文档中唯一。请注意,ID必须以字母或下划线开头,否则纯数字将无法使用。

就我个人而言,我不使用ID(我觉得它太限制了我),但你应该考虑它。请注意,XML Schema工具默认不会为您生成唯一的ID(尽管XSLT会)。

请注意,属性的名称(在您的情况下为“id”)可以是任何有效的名称(例如“Id”,“foo”),但它必须在DTD或Schema中声明为类型ID。

UPDATE:OP询问为什么我们不使用XML ID。我们经常合并来自不同来源的节点,例如

被whatver作者已经选择的标识(这不是一个单一的数据库应用程序 - 想更多的人在一个社会创造的相关博客文章,并创造它们因此人们通常会创建相同的ID(主要是m1),在这种情况下,我们可能有:

这看起来很可怕,但没有简单的答案。

我们使用其他信息来消除歧义。我们有一个规则,即id在一定范围内是唯一的 - 例如分子内的原子必须具有唯一的ID。

如果我们使用了一个独特的ID生成器,这些都是完全不透明的,我们社区中的人类会反叛(他们做到了)。

ID在非托管的人类社区中很难管理!

+0

完美!正是我在找什么。像“r1”,“r2”这样的id有点令人困惑,但这不是问题。顺便说一句我想知道你在这种情况下会做什么,如果你不使用ID? – TryHarder 2011-01-13 14:18:33

相关问题