【问题标题】:XML XSD Schema - Enforce Unique Attribute Values in SchemaXML XSD 架构 - 在架构中强制使用唯一的属性值
【发布时间】:2011-07-29 07:37:43
【问题描述】:

假设我有一个定义以下 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>

请注意,有两个 Add 元素的 KeyKey2

这里是简单的模式供参考:

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

我的印象是这在架构级别是不可能的,但是我全神贯注。

【问题讨论】:

    标签: xml schema xml-validation


    【解决方案1】:

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

    【讨论】:

    • 请多解释,没明白,我的意思是把这个schema生成的xml放上去
    • 您在寻找什么样的解释?解释 xs:unique 的 XSD 教程?您肯定可以在任何关于 XSD 的不错的书籍或教程中找到这一点。
    • 应该是 吗?
    • 您可以提供链接和简要说明。我想当我完全理解独特的用法时,我可以进行编辑。干杯。
    【解决方案2】:

    更多关于 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>
    

    【讨论】:

      【解决方案3】:

      您可以通过使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多