XML XSD模式 - 在模式中强制唯一属性值

49

假设我有一个定义以下XML的模式:

<Values>
    <Add Key="Key1">Value 1</Add>
    <Add Key="Key2">Value 2</Add>
    <Add Key="Key3">Value 3</Add>
    <Add Key="Key4">Value 4</Add>
</Values>

我希望在模式层面上能够强制要求Key属性的值是唯一的,即上述示例是有效的,但以下示例是无效的:

<Values>
    <Add Key="Key1">Value 1</Add>
    <Add Key="Key2">Value 2</Add>
    <Add Key="Key2">Value 3</Add>
    <Add Key="Key3">Value 4</Add>
</Values>

请注意,有两个键为Key2Add元素。

以下是简单模式的参考:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Values">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Add" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="Key" type="xs:token" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

我认为这在模式级别上是不可能的,但我全神贯注。

3个回答

66

@BatteryBackupUnit 的想法是正确的,但语法更像是:

<xs:element name="Values">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Add" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="UniqueAddKey">
    <xs:selector xpath="Add" /> 
    <xs:field xpath="@Key" /> 
  </xs:unique>
</xs:element>

请提供更多的解释,我没有理解。我的意思是只需放置此模式生成的XML。 - Tarek
1
你需要什么样的解释?关于xs:unique的XSD教程?你肯定可以在任何一本体面的XSD书籍或教程中找到它。 - Michael Kay
这应该是 <xs:element ref="Add" maxOccurs="unbounded"/> 吗? - Michael Tontchev
2
你可以提供链接和简短的描述。我想当我完全理解unique的用法时,我可以提交编辑。干杯。 - NicoBerrogorry

8

关于Michael Kay的回答,如果你的模式(XSD)声明了命名空间,则必须在你的selection.xpath中包含它。如果你使用的是Microsoft Visual Studio 2010,可能会自动声明一个命名空间。

<xs:schema id="MyData"
    targetNamespace="http://tempuri.org/MyData.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/MyData.xsd"
    xmlns:mstns="http://tempuri.org/MyData.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    ...
    <xs:unique name="UniqueAddKey">
        <xs:selector xpath="mstns:Add" /> 
        <xs:field xpath="@Key" /> 
    </xs:unique>
</xs:schema>

6
你可以使用xs:unique来实现这一点。
<xs:element name="Instrument">
  <xs:complexType>
   <xs:all>
    <xs:unique name="ModuleId">
      <xs:selector xpath="./*" /> 
      <xs:field xpath="@id" /> 
    </xs:unique>
   </xs:all>
  </xs:complexType>
</xs:element>

以上示例将强制所有仪器元素具有唯一属性"id"。 还有xs:key,可用于建立主键-外键关系: http://www.datypic.com/books/defxmlschema/chapter17.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接