问题描述
我想做的是,在学位中,不应该有属性编号具有相同值的课程。
例如:这个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>