具有唯一ID作为属性的XSD架构

时间:2013-09-06 12:52:03

标签: xml xsd unique-index

我想为以下XML编写XSD架构:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<siss-statusquery xmlns="http://www.example.de/test">
    <myhash id="1">DG5F6DFG13DFG5641DG5F6DFG13DFG56411337AS</myhash>
    <myhash id="2">123AWDFG13DFG5641DG5F6DFG13GFG56411337AS</myhash>
    <myhash id="3">DG5F6DFG13DFG5641DG5F6325DFG13DFG5641143</myhash>
</siss-statusquery>

条件:

  • <myhash />代码,minoccur:1,maxoccur:unbounded
  • id属性,键入:unsignedIntuniquerequired
  • <sah1hash />代码值模式:[0-9A-Z]{40,40}

我的尝试:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified"
    elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.de/test" xmlns:lhs="http://www.example.de/test">

    <xs:simpleType name="myhashType">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9A-Z]{40,40}" />
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="siss-statusquery">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="myhash" maxOccurs="unbounded"
                    minOccurs="1">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="lhs:myhashType">
                                <xs:attribute type="xs:unsignedInt" name="id" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

如何将id属性限制/限制为唯一。

1 个答案:

答案 0 :(得分:3)

XML Schema有一个全局唯一ID类型 - xs:ID - 但是你不能在这里使用它,因为这种类型的值必须是有效的XML名称(所以特别是它们不能以数字开头)。

应用更一般的唯一性约束的方法是使用xs:unique

<xs:element name="siss-statusquery">
    <xs:complexType>
       <!-- as before -->
    </xs:complexType>
    <xs:unique name="uniqueId">
        <xs:selector xpath="lhs:myhash" />
        <xs:field xpath="@id" />
    </xs:unique>
</xs:element>

阅读本文的方法是,在包含元素的范围内,selector匹配的所有元素必须具有不同的field值。因此,在这种情况下,siss-statusquery内的所有myhash元素都必须具有不同的id属性。