如何在XSD中限制元素的属性?

时间:2016-04-26 10:41:50

标签: xml xsd

我有这个XML代码:

 <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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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还会 允许namefnamelname根元素。这看起来并不好看 对。也许您应该在本地定义全部或部分内容 而非全球。
  3. 以下是所有上述调整的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>