XML Schema选择和属性

时间:2012-05-07 17:44:35

标签: xml layout xsd choice

每个人我都有一点问题我希望一个属性充当member_id。

这是因为如果我把它作为另一个标签我不能得到它总是唯一我只能使它对所有full_member类型和basic_member类型都是唯一的。

所以我想我可以用属性和密钥解决这个问题。

但我的问题是我不能在彼此旁边有一个属性和选择,或者我只是不知道如何做对。

到目前为止,我的架构如下。

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

    <xs:complexType name="memberinfo">
      <xs:sequence>
        <xs:element ref="member_id"/>
        <xs:element ref="first_name"/>
        <xs:element ref="last_name"/>
        <xs:element ref="address"/>
        <xs:element ref="contact_numbers"/>
        <xs:element ref="date_joined"/>
      </xs:sequence>
    </xs:complexType>

  <xs:element name="member_id" type="xs:integer"/>
  <xs:element name="first_name" type="xs:NCName"/>
  <xs:element name="last_name" type="xs:NCName"/>
  <xs:element name="address">
    <xs:complexType>
      <xs:sequence>
        <xs:choice>
        <xs:element ref="house_number"/>
        <xs:element ref="house_name"/>
        </xs:choice>
        <xs:element ref="street"/>
        <xs:element ref="town"/>
        <xs:element ref="city"/>
        <xs:element ref="county"/>
        <xs:element ref="postcode"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="house_number" type="xs:integer"/>
  <xs:element name="house_name" type="xs:string"/>
  <xs:element name="street" type="xs:string"/>
  <xs:element name="town" type="xs:NCName"/>
  <xs:element name="city" type="xs:NCName"/>
  <xs:element name="county" type="xs:NCName"/>
  <xs:element name="postcode" type="xs:NCName"/>
  <xs:element name="contact_numbers">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="3" ref="contact_number"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="contact_number" type="xs:integer"/>
  <xs:element name="date_joined" type="xs:date"/>

 <xs:complexType name="basic_member">
   <xs:complexContent>
     <xs:extension base="memberinfo">
       <xs:sequence>
         <xs:element name="activities">
           <xs:complexType>
             <xs:sequence>
               <xs:element name="activity_name" maxOccurs="3"/>
             </xs:sequence>
           </xs:complexType>
         </xs:element>
       </xs:sequence>
     </xs:extension>
   </xs:complexContent>
 </xs:complexType>

  <xs:complexType name="full_member">
    <xs:complexContent>
      <xs:extension base="memberinfo">
        <xs:sequence>
          <xs:element name="activities">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="activity_name" maxOccurs="unbounded"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="members" >
    <xs:complexType>
      <xs:sequence>
  <xs:element name="member" maxOccurs="unbounded">
    <xs:complexType>
      <xs:attribute name="member_id"/>
    </xs:complexType>
  </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:key name="PK_member">
      <xs:selector xpath=".//member" />
      <xs:field xpath="member_id" />
    </xs:key>
  </xs:element>

</xs:schema>

条目示例

<member>
    <full_member>
        <member_id>1</member_id>
        <first_name>Simon</first_name>
        <last_name>Hughes</last_name>
        <address>
            <house_number>12</house_number>
            <street>Ashgrove Road</street>
            <town>Forest Town</town>
            <city>Mansfield</city>
            <county>Nottinghamshire</county>
            <postcode>NG385DX</postcode>
        </address>
        <contact_numbers>
            <contact_number>01623948594</contact_number>
            <contact_number>01623349596</contact_number>
            <contact_number>01623486599</contact_number>
        </contact_numbers>
        <date_joined>2012-05-21</date_joined>
        <activities>
            <activity_name>Treadmill</activity_name>
            <activity_name>Squash</activity_name>
            <activity_name>Table Tennis</activity_name>
            <activity_name>Weights</activity_name>
        </activities>
    </full_member>
    </member>

    <member>
    <full_member>
        <member_id>2</member_id>
        <first_name>Scott</first_name>
        <last_name>Calladine</last_name>
        <address>
            <house_name>Don House</house_name>
            <street>Simons Road</street>
            <town>Broadton</town>
            <city>Supper</city>
            <county>Nottinghamshire</county>
            <postcode>N496DX</postcode>
        </address>
        <contact_numbers>
            <contact_number>01623395865</contact_number>
            <contact_number>01623496959</contact_number>
            <contact_number>01623005604</contact_number>
        </contact_numbers>
        <date_joined>2007-08-16</date_joined>
        <activities>
            <activity_name>Static Cycle</activity_name>
            <activity_name>Badminton</activity_name>
            <activity_name>Table Tennis</activity_name>
        </activities>
    </full_member>
    </member>

<member>
    <full_member>
        <member_id>3</member_id>
        <first_name>Fransis</first_name>
        <last_name>Smith</last_name>
        <address>
            <house_name>Don House</house_name>
            <street>Lemington Close</street>
            <town>Bradford</town>
            <city>Bradfordcity>
            <county>West Yorkshire</county>
            <postcode>BD723DX</postcode>
        </address>
        <contact_numbers>
            <contact_number>01623497035</contact_number>
            <contact_number>01623389468</contact_number>
            <contact_number>01623439949</contact_number>
        </contact_numbers>
        <date_joined>2007-08-16</date_joined>
        <activities>
            <activity_name>Static Cycle</activity_name>
            <activity_name>Badminton</activity_name>
            <activity_name>Table Tennis</activity_name>
        </activities>
    </full_member>
    </member>

<member>
    <full_member>
        <member_id>4</member_id>
        <first_name>Hayley</first_name>
        <last_name>Cummingham</last_name>
        <address>
            <house_number>87</house_number>
            <street>Boreast Road</street>
            <town>Braranger</town>
            <city>Mansfield</city>
            <county>Nottinghamshire</county>
            <postcode>N454HX</postcode>
        </address>
        <contact_numbers>
            <contact_number>01623306031</contact_number>
            <contact_number>01623206940</contact_number>
            <contact_number>01623059680</contact_number>
        </contact_numbers>
        <date_joined>2012-05-21</date_joined>
        <activities>
            <activity_name>Treadmill</activity_name>
            <activity_name>Squash</activity_name>
            <activity_name>Table Tennis</activity_name>
            <activity_name>Weights</activity_name>
        </activities>
    </full_member>
    </member>

但是使用我当前的架构,id会变为1,1,2,2

谢谢你

1 个答案:

答案 0 :(得分:0)

我认为这样做会:

<xs:key name="PK_member"> 
  <xs:selector xpath=".//basic_member|.//full_member" /> 
  <xs:field xpath="member_id" /> 
</xs:key>

但您的架构中似乎有问题 - 或者至少,它与您的示例XML不匹配。在架构中members包含一个只有一个属性的member元素,并且有两个独立的 - 无关的 - full_memberbasic_member元素,而在您的XML文件中{ {1}}和basic_member显示在full_member内。