为什么我的XSD允许在我的XML中使用禁止的属性?
问题描述:
我已将名为Classroom的属性插入名为Lecture的元素中。这里的XML模式:为什么我的XSD允许在我的XML中使用禁止的属性?
<xsd:attribute name="Classroom" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="0"/>
<xsd:maxLength value="7"/>
</xsd:restriction>
</xsd:simpleType>
.
.
.
<xsd:complexType name="labType">
<xsd:complexContent>
<xsd:restriction base="eventType">
<xsd:sequence>
<xsd:element name="Title" type="xsd:string"/>
<xsd:element name="Lecture" maxOccurs="10" minOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="Clasroom" use="prohibited"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
.
.
.
<xsd:element name="Lab" substitutionGroup="Event" type="labType"/>
我遇到的问题是,这种模式并不适用于该属性的限制。 我试图验证此XML代码:
<Lab>
<Title>Artificial Intelligence</Title>
<Lecture Classroom="BA">
<Day>Friday</Day>
<Time>17:00-18:00</Time>
</Lecture>
</Lab>
我的问题是,这个XML报告为有效,即使它使用属性“课堂”(它不应该是能够做到)。 我是新来的XML,所以请不要苛刻。 提前谢谢!
答
你的Lecture
声明,
<xsd:element name="Lecture" maxOccurs="10" minOccurs="1"/>
没有声明类型Lecture
,让你有效地允许任何内容和任何属性上Lecture
,无论任何限制,你可能已经在Classroom
其他地方定义在XSD中。
下面是一个完整XSD能够成功验证XML:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Lab">
<xs:complexType>
<xs:sequence>
<xs:element name="Title" type="xs:string"/>
<xs:element name="Lecture">
<xs:complexType>
<xs:sequence>
<xs:element name="Day" type="xs:string"/>
<xs:element name="Time" type="xs:string"/>
</xs:sequence>
<xs:attribute name="Classroom">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="7"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
上述XSD将允许Lecture
的Classroom
属性,但将限制值设置为0和7之间,包括端点是长度的字符串。
您还可以添加xs:attribute/use="prohibited"
防止@Classroom
出现在Lecture
,但你的原题,和你的问题的一部分,
我遇到的问题是,这种模式不适用 限制属性。
暗示您的问题的焦点在于为什么限制没有效果。也许你的意思是任何限制在一般意义上 - xs:restriction
或use="prohibit"
。那么,答案是一样的:通过不分配类型到Lecture
,你允许它是任何类型和任何属性。
答
错字在Clasroom
(仅1“S”)
<xsd:attribute name="Clasroom" use="prohibited"/>
问题的另一部分是该属性限制被施加到Lab
元件而非Lecture
元件。
“禁止”(+ 1)的好结果。原来的标题提到了“限制”,但您可能是正确的,OP在想,为什么限制泛型意义上的属性,包括'use ='禁止',对XML没有影响。我认为,根本原因是未能为'讲座'指定一种类型。 – kjhughes