XML Schema使用唯一约束不正确地进行验证

时间:2013-06-03 17:29:04

标签: xml xsd unique-constraint eclipse-wtp xsd-validation

我搜索了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>

1 个答案:

答案 0 :(得分:2)

你很亲密。但是你有两件事需要清理。

首先,将您的唯一性约束放在您希望强制执行唯一性的范围内,并编写选择器表达式以将其作为上下文节点使用。 (在您显示的代码中,唯一性约束在library元素的声明中,而选择器'uk:library / uk:book'不会选择任何内容。要么您希望ISBN是唯一的在文档中,或者你只希望它在给定的库中是唯一的。在前一种情况下,将声明移动到uk:root的声明中,在后者中从选择器路径中删除第一步。)

其次,清理你的命名空间故事。您没有显示相关的命名空间声明,所以我猜这个

  • 在架构文档中,前缀uk绑定到架构的目标命名空间。
  • 在XML实例中,该命名空间是默认命名空间。

如果不是这种情况,您需要将它们作为案例,或者关注您的命名空间的其他故事并一致地遵循它。

现在,最大的不一致是在两个XPath表达式中,您假设元素uk:libraryuk:book将是名称空间限定的,并且元素isbn将不是合格的命名空间。您显示的模式部分足以表明那些不是两种情况。架构文档在其xs:schema元素上指定elementFormDefault="qualified",在这种情况下,您需要将uk:添加到字段路径,或者指定elementFormDefault="unqualified"(或者不指定属性在all),在这种情况下,您需要从选择器路径中删除命名空间前缀。

如果您确实希望librarybook符合名称空间且isbn不合格,则需要在其中至少一个上使用form属性。