0

我搜索了一个答案,找到了答案,但这些解决方案似乎对我不起作用。下面是我的 xml 和我的架构。这个想法很简单:没有两本书可以共享相同的 isbn,但是当两本书的 isbn 相等时,eclipse 不会给我一个错误。

ns 前缀是 uk。

<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>

4

1 回答 1

2

你很近。但是你有两件事要清理。

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

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

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

如果不是这种情况,您需要使它们成为这种情况,或者遵循有关您的名称空间的其他一些故事并始终如一地遵循它。

现在,最大的不一致是在您的两个 XPath 表达式中,您假设元素uk:libraryuk:book将是命名空间限定的,而元素isbn将不是命名空间限定的。您显示的架构部分足以表明这些情况不可能同时存在。架构文档elementFormDefault="qualified"在其 xs:schema 元素上指定,在这种情况下您需要添加uk:到字段路径,或者它指定elementFormDefault="unqualified"(或根本不指定属性),在这种情况下您需要从选择器路径。

如果你真的想要library并且book是命名空间限定和isbn不限定的,你需要form至少在其中一个上使用该属性。

于 2013-06-03T18:28:15.430 回答