如何在XSD中声明元素的属性

时间:2014-08-28 09:25:19

标签: xml xsd

我一直在阅读各种资源并尝试各种方法,但我仍然无法做到这一点。

说XML是:

<?xml version="1.0"?>

<zoo xmlns="http://www.example.com"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.example.com zoo.xsd">
   <animal id="l123444">
      <name>Mighty</name>
      <type>lion</type>
      <kg>135</kg>
   </animal>

   <animal id="b343234">
      <name>Lucky</name>
      <type>bear</type>
      <kg>205</kg>
   </animal>
</zoo>

我应该如何编写XSD?

这是我得到的:     

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.example.com"
           xmlns="http://www.example.com"
           elementFormDefault="qualified">

<xs:element name="zoo"><xs:complexType><xs:sequence>
   <xs:element name="animal" maxOccurs="unbounded">
      <xs:complexType>
         <xs:extension base="xs:string">
            <xs:attribute name="id"/>
         </xs:extension>
         <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="type"><xs:simpleType>
                <xs:restriction base="xs:string">
                   <xs:enumeration value="lion"/>
                   <xs:enumeration value="bear"/>
                   <xs:enumeration value="tiger"/>
                </xs:restriction>
            </xs:simpleType></xs:element>
            <xs:element name="kg"><xs:simpleType>
               <xs:restriction base="xs:integer">
                  <xs:minInclusive value="10"/>
                  <xs:maxInclusive value="5000"/>
               </xs:restriction>
            </xs:simpleType></xs:element>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:sequence></xs:complexType></xs:element>

</xs:schema>

我最初可以验证文档。当我尝试添加并声明id属性时,验证失败。任何线索?

1 个答案:

答案 0 :(得分:2)

您不需要extension类型下的animal,只需

<xs:element name="animal" maxOccurs="unbounded">
  <xs:complexType>
     <xs:sequence>
       <!-- child elements -->
     </xs:sequence>
     <xs:attribute name="id" type="xs:string"/>
   </xs:complexType>
</xs:element>

没有明确超类型(即没有simpleContentcomplexContent)的复杂类型的属性声明直接位于complexType下,并且必须 之后 sequence(或choice或其他)。