微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xsd 中有没有办法成为没有重复值的属性?

如何解决xsd 中有没有办法成为没有重复值的属性?

我想做的是,在学位中,不应该有属性编号具有相同值的课程。

例如:这个xml的例子是错误的:有两个课程的属性编号的值相同。

<Degree location="Madrid">
<Name>Err18</Name>
<Scope>humanities</Scope>
<Course number="1">
...
</Course>
<Course number="1">
...
</Course>
<Course number="4">
...
</Course>
</Degree>

这是我的 xsd 代码。我该怎么办?

<?xml version='1.0' encoding='utf-8'?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Degree">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="Name" minOccurs="1" maxOccurs="1" />
            <xsd:element name="Scope" minOccurs="1" maxOccurs="1">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="humanities" />
                        <xsd:enumeration value="science" />
                        <xsd:enumeration value="technology" />
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:element>
            <xsd:element name="Course" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="Subject" maxOccurs="unbounded">
                            <xsd:complexType>
                                <xsd:sequence>
                                    <xsd:element ref="Name" minOccurs="1" maxOccurs="1" />
                                    <xsd:element name="Student" maxOccurs="unbounded">
                                        <xsd:complexType mixed="true">
                                            <xsd:sequence>
                                                <xsd:element ref="Name" minOccurs="1" maxOccurs="1" />
                                                <xsd:choice>
                                                    <xsd:element name="Dni">
                                                        <xsd:simpleType>
                                                            <xsd:restriction base="xsd:string">
                                                                <xsd:pattern value="[0-9]{8}[A-Z]{1}"/>
                                                            </xsd:restriction>
                                                        </xsd:simpleType>
                                                    </xsd:element>
                                                    <xsd:element name="Resident">
                                                        <xsd:simpleType>
                                                            <xsd:restriction base="xsd:string">
                                                                <xsd:pattern value="[A-Z]{1}[0-9]{7}"/>
                                                            </xsd:restriction>
                                                        </xsd:simpleType>
                                                    </xsd:element>
                                                </xsd:choice>
                                                <xsd:element name="Grade" minOccurs="1" maxOccurs="1" >
                                                    <xsd:simpleType>
                                                        <xsd:restriction base="xsd:decimal">
                                                            <xsd:fractionDigits fixed="true" value="2"/>
                                                        </xsd:restriction>
                                                    </xsd:simpleType>
                                                </xsd:element>
                                                <xsd:element ref="EAML" minOccurs="0"/>
                                            </xsd:sequence>
                                        </xsd:complexType>
                                    </xsd:element>
                                </xsd:sequence>
                                <xsd:attribute name="idSub" use="required" type="xsd:string"/>
                                <xsd:attribute name="type" use="required">
                                    <xsd:simpleType>
                                        <xsd:restriction base="xsd:string">
                                            <xsd:enumeration value="core" />
                                            <xsd:enumeration value="specialty" />
                                            <xsd:enumeration value="optional" />
                                        </xsd:restriction>
                                    </xsd:simpleType>
                                </xsd:attribute>
                            </xsd:complexType>
                        </xsd:element>
                    </xsd:sequence>
                    <xsd:attribute name="number" use="required">
                        <xsd:simpleType>
                            <xsd:restriction base="xsd:integer">
                                <xsd:minInclusive value="1"/>
                                <xsd:maxInclusive value="4"/>
                            </xsd:restriction>
                        </xsd:simpleType>
                    </xsd:attribute>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="location" use="optional">
        </xsd:attribute>
    </xsd:complexType>
    <xsd:unique name="univoco">
    <xsd:selector xpath="Course/Subject"/>
    <xsd:field xpath="@idSub"/>
    </xsd:unique>
</xsd:element>
<xsd:element name="Name" type="xsd:string" />
<xsd:element name="EAML" type="xsd:anyURI" />
</xsd:schema>

我尝试过枚举和 maxOcurrs,但没有奏效。

解决方法

您需要使用 <xs:unique> 元素在 XSD 中创建唯一约束。

XML

<?xml version="1.0"?>
<Degree location="Madrid">
    <Name>Err18</Name>
    <Scope>humanities</Scope>
    <Course number="1">...</Course>
    <Course number="1">...</Course>
    <Course number="4">...</Course>
</Degree>

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
    <xs:element name="Degree">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Name"/>
                <xs:element ref="Scope"/>
                <xs:element maxOccurs="unbounded" ref="Course"/>
            </xs:sequence>
            <xs:attribute name="location" use="required" type="xs:string"/>
        </xs:complexType>
        <xs:unique name="UniqueCourseNumber">
            <xs:selector xpath="Course"/>
            <xs:field xpath="@number"/>
        </xs:unique>
    </xs:element>
    <xs:element name="Name" type="xs:string"/>
    <xs:element name="Scope" type="xs:string"/>
    <xs:element name="Course">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:NMTOKEN">
                    <xs:attribute name="number" use="required" type="xs:integer"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
</xs:schema>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。