2016-11-11 79 views
1

我已将名为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,所以请不要苛刻。 提前谢谢!

回答

1

你的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将允许LectureClassroom属性,但将限制值设置为0和7之间,包括端点是长度的字符串。

您还可以添加xs:attribute/use="prohibited"防止@Classroom出现在Lecture,但你的原题,和你的问题的一部分,

我遇到的问题是,这种模式不适用 限制属性。

暗示您的问题的焦点在于为什么限制没有效果。也许你的意思是任何限制在一般意义上 - xs:restrictionuse="prohibit"。那么,答案是一样的:通过不分配类型到Lecture,你允许它是任何类型和任何属性。

2

错字在Clasroom(仅1“S”)

<xsd:attribute name="Clasroom" use="prohibited"/> 

问题的另一部分是该属性限制被施加到Lab元件而非Lecture元件。

+0

“禁止”(+ 1)的好结果。原来的标题提到了“限制”,但您可能是正确的,OP在想,为什么限制泛型意义上的属性,包括'use ='禁止',对XML没有影响。我认为,根本原因是未能为'讲座'指定一种类型。 – kjhughes

相关问题