2016-04-26 69 views
1

我有这样的XML代码:如何在XSD中限制元素的属性?

<student> 
    <name sex="male"> 
     <fname></fname> 
     <lname></lname> 
    </name> 
</student> 

我想要做的是限制添加到sex属性。 sex属性应该只取男性女性作为它们的值。 我有制作这个XML Schema的基本知识。到目前为止,我所做的是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="name" type="nameType"/> 
    <xs:element name="fname" type="xs:string"/> 
    <xs:element name="lname" type="xs:string"/> 
    <xs:element name="student" type="studentType"/> 

    <xs:complexType name="nameType"> 
     <xs:sequence> 
      <xs:element ref="fname"></xs:element> 
      <xs:element ref="lname"></xs:element> 
     </xs:sequence> 
     <xs:attribute name="sex"></xs:attribute> 
    </xs:complexType> 

    <xs:complexType name="studentType"> 
     <xs:sequence> 
      <xs:element ref="name"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

回答

0

您可以如下图所示添加限制属性的值:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="name" type="nameType"/> 
    <xs:element name="fname" type="xs:string"/> 
    <xs:element name="lname" type="xs:string"/> 
    <xs:element name="student" type="studentType"/> 

    <xs:complexType name="nameType"> 
     <xs:sequence> 
      <xs:element ref="fname"></xs:element> 
      <xs:element ref="lname"></xs:element> 
     </xs:sequence> 
     <xs:attribute name="sex"> 
      <xs:simpleType> 
       <xs:restriction base="xs:string"> 
        <xs:enumeration value="ar"></xs:enumeration> 
        <xs:enumeration value="en"></xs:enumeration> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:attribute> 
    </xs:complexType> 

    <xs:complexType name="studentType"> 
     <xs:sequence> 
      <xs:element ref="name"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
0

使用xs:restriction将属性限制为一组固定的枚举通过xs:enumeration

<xs:attribute name="sex"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="male"/> 
     <xs:enumeration value="female"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:attribute> 

另外两个意见:

  1. 您可以通过<el/>表示法缩短空元素。
  2. 除了允许使用student根元素,您的XSD将允许 允许name,fnamelname根元素。这看起来不是 的权利。也许你应该定义全部或部分本地 而不是全局。

这是您的XSD与上述所有调整:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="student" type="studentType"/> 

    <xs:complexType name="studentType"> 
    <xs:sequence> 
     <xs:element name="name" type="nameType"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="nameType"> 
    <xs:sequence> 
     <xs:element name="fname" type="xs:string"/> 
     <xs:element name="lname" type="xs:string"/> 
    </xs:sequence> 
    <xs:attribute name="sex"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="male"/> 
      <xs:enumeration value="female"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 

</xs:schema> 
+0

非常感谢您@kjhughes!感谢您的建议。 –

+0

不客气。如果有帮助,请[**接受**](http://meta.stackoverflow.com/q/5234/234215)这个答案。谢谢。 – kjhughes