2017-10-19 277 views
0

我想验证两个字段总是唯一的值,在同一个complexType中。我想在我的XSD中进行验证,而不是直接在代码中进行验证。如何让两个不同的元素在XSD中具有相同复杂类型的唯一值?

我知道我不能使用类型“的xs:ID”两次相同的复杂类型里面,不幸的是我不能做标签的工作。

我已经有一个属性“BOOKID”使用型“的xs:ID”的复杂类型里面,所以我想在使用标签,以保证唯一值的其他元素“BOOKNAME”。

我有以下结构:

<xs:complexType name="book"> 
    <xs:sequence> 
     <xs:element name = "bookName" nillable="true" minOccurs="0"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string" 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     <xs:element name = "bookPrice" nillable="true" minOccurs="0"> 
      <xs:simpleType> 
       <xs:restriction base="xs:decimal" 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
</xs:sequence> 
     <xs:attribute name="bookId" type="xs:ID" use="required"/> 
</xs:complexType> 

我已经尝试做以下,但没有成功:

<xs:complexType name="book"> 
    <xs:sequence> 
     <xs:element name = "bookName" nillable="true" minOccurs="0"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
      </xs:simpleType> 
      <xs:unique name="uniqueBookName"> 
       <xs:selector xpath="book"/> 
       <xs:field xpath="bookName"/> 
      </xs:unique> 
     </xs:element> 
     <xs:element name = "bookPrice" nillable="true" minOccurs="0"> 
      <xs:simpleType> 
       <xs:restriction base="xs:decimal" 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
</xs:sequence> 
     <xs:attribute name="bookId" type="xs:ID" use="required"/> 
</xs:complexType> 

我使用的XML版本1.0。我不知道我可以从这里尝试什么,以便将其付诸实施。

有人对如何实现这一目标的提示?非常感谢。在这里需要

回答

0

几个答案或评论。

  1. 为什么您认为您不能将类型xs:ID分配给同一复杂类型中的两个不同元素?在XSD 1.0中,为了与XML DTD兼容,同一元素上的多个ID属性被禁止,但您使用的是元素,而不是属性。在XSD 1.1中,允许多个ID属性,就像允许多个ID子项一样。

    除非我失去了一些东西(总是可能的),你应该不信任任何的信息源告诉你的xs:ID不能分配到相同的复杂类型中的多个元素。当然,他们告诉你的东西有些微妙的不同,你误解了一些细节。

  2. 如果您希望使用唯一性约束条件而不是ID,请声明唯一性约束条件,该条件范围内的ID必须是唯一的,而不是book元素或bookName元素。现在,您的唯一性约束指定bookName元素的字符串值在给定的bookName元素内必须是唯一的。由于bookName元素永远不会有多个字符串值,所以这个约束条件将始终得到满足,无论是否带有xsd:unique。如果您希望书名与祖先元素bookCollection(或您称之为的任何东西)是唯一的,请在此声明唯一性约束。

    请注意,您可以要求书名必须是唯一的,并且书名必须是唯一的,或者没有两个元素的书名或书名与书名或任何其他元素的书名相同。在第一种情况下,书名与某些书名相同并不是错误,只是因为它与其他书的书名相同。

  3. 如果你认为在现实世界中没有两本书具有相同的名称,则可能需要多出去走走。国际标准图书的发明正是因为不同的书籍具有相同的标题并不罕见。

    如果您认为图书名称可能是由类型xs:ID合理表示的,那么您可能需要花一些时间查看图书,还需要阅读xs:ID类型,该类型要求其值是以一封信,不包含空格。看看我桌上目前的书,我看不到一个标题可能是有效的xs:ID值。

    价格大多与数值一起给出,所以对于关心验证的人来说,xsd:string可能有点松散,因为数据类型。

+0

首先,感谢您的回复。 1)你是对的。我从一个值得信任的来源看到了这一点:“复杂类型不能包含多个xsd:ID类型的属性,或者包含任何派生自xsd:ID的类型。”就我而言,我有一个属性和一个元素。所以我想在元素和属性中使用xs:ID并不是问题。尽管如此,我试图把类型xs:ID放在元素“bookName”中,当我测试它时没有验证值的唯一性。 2)您建议我将唯一标记从“bookName”范围中传递出来,但仍在complexType“book”中? – Amorti

+0

不,我并不是建议你在一本书的范围内应用唯一性约束(这就是我想要描述的“书”类型)。我建议你指定唯一性约束的元素,其范围内的标识符必须是唯一的。这可能是表示书籍集合的元素,或者是出现在文档根部或其他位置的元素。但是在书中说一本书的ID必须是唯一的,这完全没有意义。 –

+0

好吧,想象我确实有一个complexType是bookCollection。在那个complexType里面,我有一本元素书。现在想象一下,我有很多元素的type =“bookCollection”。我的想法是直接将唯一标签放在bookCollection中,这样我就可以将约束应用于书本,并且所有引用“bookCollection”类型的元素都将从这些约束中“受益”。问题是,我不能这样做。它只适用于我在父节点(具有类型bookCollection的元素)中声明唯一标记,并且最终得到许多独特标记。 – Amorti

相关问题