为XSD架构中的不同类型的元素分配唯一属性

时间:2011-01-13 13:01:13

标签: xsd unique

我是XML和XSD的新手,我对XML-Schema验证有疑问。考虑XML文件:

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

我想强制id属性是唯一的。如果元素具有相同的类型,谷歌帮助了我很多。但我不能制作一个sinlge元素序列'Request',因为每个请求可以包含不同的信息,根据他的类型。我该怎么办? 在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

  

有效性约束:ID

     

ID类型的值必须与Name匹配   生产。名称不得出现   不止一次在XML文档中作为   这种类型的价值;即ID值   必须唯一地标识元素   承担他们的。

名称制作

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

这表示如果属性声明为类型ID(无论是在DTD还是XMLSchema中),则验证程序必须确保它在文档中是唯一的。请注意,ID必须以字母或下划线开头,因此纯数字不起作用。

我个人不使用ID(我发现它对我来说太限制了),但你应该考虑一下。请注意,XML Schema工具默认情况下不会为您生成唯一的ID(尽管XSLT会这样)。

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

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

  

  

ID是作者所选择的(这不是一个单一的数据库应用程序 - 更多地考虑在社区中创建博客帖子并创建他们的ID。因此人们创建相同的ID(主要是m1)是很常见的。那种情况我们可能会有:

     

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

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

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

在非托管人类社区中,ID不容易管理!