我搜索了SO以寻找答案,找到了答案,但解决方案似乎对我不起作用。下面是我的xml和我的架构。这个想法很简单:没有两本书可以共享同一个isbn,但是当两本书中的isbn相等时,eclipse不会给我一个错误。
ns前缀是英文。
<library>
<book>
<isbn>
1
</isbn>
<title>
Bernard Williams: A Biography
</title>
</book>
<book>
<isbn>
1
</isbn>
<title>
Principles of Microbiopsychonomics
</title>
</book>
</library>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="library">
<xs:complexType>
<xs:sequence>
<xs:element name="book" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="isbn" type="xs:integer"/>
<xs:element name="title" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="uniquebook">
<xs:selector xpath="uk:library/uk:book"/>
<xs:field xpath="isbn"/>
</xs:unique>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 0 :(得分:2)
你很亲密。但是你有两件事需要清理。
首先,将您的唯一性约束放在您希望强制执行唯一性的范围内,并编写选择器表达式以将其作为上下文节点使用。 (在您显示的代码中,唯一性约束在library
元素的声明中,而选择器'uk:library / uk:book'不会选择任何内容。要么您希望ISBN是唯一的在文档中,或者你只希望它在给定的库中是唯一的。在前一种情况下,将声明移动到uk:root的声明中,在后者中从选择器路径中删除第一步。)
其次,清理你的命名空间故事。您没有显示相关的命名空间声明,所以我猜这个
uk
绑定到架构的目标命名空间。如果不是这种情况,您需要将它们作为案例,或者关注您的命名空间的其他故事并一致地遵循它。
现在,最大的不一致是在两个XPath表达式中,您假设元素uk:library
和uk:book
将是名称空间限定的,并且元素isbn
将不是合格的命名空间。您显示的模式部分足以表明那些不是两种情况。架构文档在其xs:schema元素上指定elementFormDefault="qualified"
,在这种情况下,您需要将uk:
添加到字段路径,或者指定elementFormDefault="unqualified"
(或者不指定属性在all),在这种情况下,您需要从选择器路径中删除命名空间前缀。
如果您确实希望library
和book
符合名称空间且isbn
不合格,则需要在其中至少一个上使用form
属性。