12

我已经定义了两种复杂的元素类型——Developer 和 App。

开发人员子项 - ID、姓名、电子邮件

应用子项 - ID、名称、开发人员

这里的Developer in App 复杂元素是指 Developer/ID。

如何在 xml 模式中定义这种关系。我正在使用 XML spy2013 编辑器。

我尝试在简单类型 Developer->ID 的声明中指定名称。并在 App->Developer 数据类型中使用此名称。但它给出了错误..

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2013 (x64) (http://www.altova.com) by Piyush (USC) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"          attributeFormDefault="unqualified">
<xs:element name="appinfo">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Developer">
                <xs:complexType>
                    <xs:all>
                        **<xs:element name="ID">**
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:length value="5"/>
                                    <xs:pattern value="[a-zA-Z][a-zA-Z][0-9][0-9][a-zA-Z]"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Name">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="([a-zA-Z])+"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Email">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="[^@]+@[^\.]+\..+"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Company" type="xs:string"/>
                        <xs:element name="Website" type="xs:string"/>
                        <xs:element name="Phone">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:length value="13"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:all>
                </xs:complexType>
            </xs:element>
            <xs:element name="App">
                <xs:complexType>
                    <xs:all>
                        <xs:element name="ID">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:length value="5"/>
                                    <xs:pattern value="[0-9][0-9][0-9][0-9][A-Z]"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Name">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:pattern value="([a-zA-Z])+"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Developer" ***type="xs:anySimpleType"/>***
                        <xs:element name="Price">
                            <xs:simpleType>
                                <xs:restriction base="xs:float">
                                    <xs:minInclusive value="0.00"/>
                                    <xs:maxInclusive value="6.99"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="TabletCompatible" type="xs:boolean" minOccurs="0"/>
                        <xs:element name="Category">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="Travel"/>
                                    <xs:enumeration value="Productivity"/>
                                    <xs:enumeration value="Game"/>
                                    <xs:enumeration value="Music"/>
                                    <xs:enumeration value="Education"/>
                                    <xs:enumeration value="Lifestyle"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="Platform">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="Android"/>
                                    <xs:enumeration value="iOS"/>
                                    <xs:enumeration value="Blackberry"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:all>
                </xs:complexType>
            </xs:element>
            <xs:element name="AppStat">
                <xs:complexType>
                    <xs:all>
                        <xs:element name="AppID" type="xs:anySimpleType"/>
                        <xs:element name="Statistics">
                            <xs:complexType>
                                <xs:sequence maxOccurs="unbounded">
                                    <xs:element name="Platform" type="xs:anySimpleType"/>
                                    <xs:element name="Downloads" type="xs:positiveInteger"/>
                                    <xs:element name="Rating">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:float">
                                                <xs:minInclusive value="0.0"/>
                                                <xs:maxInclusive value="5.0"/>
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="LastChecked" type="xs:date"/>
                    </xs:all>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

4

1 回答 1

17

为开发者 ID 使用通用简单类型的方法是在开头将其声明为命名类型:

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified"          
  attributeFormDefault="unqualified">

  <xs:simpleType name="developerID">
    <xs:restriction base="xs:string">
      <xs:length value="5"/>
      <xs:pattern value="[a-zA-Z][a-zA-Z][0-9][0-9][a-zA-Z]"/>
    </xs:restriction>
  </xs:simpleType>

  . . . 

然后使用它:

 . . . 
    <xs:element name="Developer" maxOccurs="unbounded">
      <xs:complexType>
        <xs:all>
          <xs:element name="ID" type="developerID">
 . . . 
    <xs:element name="App" maxOccurs="unbounded">
      <xs:complexType>
        <xs:all>
          . . .
          <xs:element name="Developer" type="developerID"/>

但这还不足以创建一个appinfo/App/Developer只能包含一个开发人员在 中声明的 id 的约束appinfo/Developer/ID。为此,需要使用创建唯一键定义xs:key并使用它引用它xs:keyref(参见此处)。

这是完整的 XSD:

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified"          
  attributeFormDefault="unqualified">

  <xs:simpleType name="developerID">
    <xs:restriction base="xs:string">
      <xs:length value="5"/>
      <xs:pattern value="[a-zA-Z][a-zA-Z][0-9][0-9][a-zA-Z]"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="appinfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Developer" maxOccurs="unbounded">
          <xs:complexType>
            <xs:all>
              <xs:element name="ID" type="developerID">
              </xs:element>
              <xs:element name="Name">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="([a-zA-Z])+"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Email">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="[^@]+@[^\.]+\..+"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Company" type="xs:string"/>
              <xs:element name="Website" type="xs:string"/>
              <xs:element name="Phone">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:length value="13"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="App" maxOccurs="unbounded">
          <xs:complexType>
            <xs:all>
              <xs:element name="ID">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:length value="5"/>
                    <xs:pattern value="[0-9][0-9][0-9][0-9][A-Z]"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Name">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="([a-zA-Z])+"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Developer" type="developerID"/>
              <xs:element name="Price">
                <xs:simpleType>
                  <xs:restriction base="xs:float">
                    <xs:minInclusive value="0.00"/>
                    <xs:maxInclusive value="6.99"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="TabletCompatible" type="xs:boolean" minOccurs="0"/>
              <xs:element name="Category">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="Travel"/>
                    <xs:enumeration value="Productivity"/>
                    <xs:enumeration value="Game"/>
                    <xs:enumeration value="Music"/>
                    <xs:enumeration value="Education"/>
                    <xs:enumeration value="Lifestyle"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Platform">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="Android"/>
                    <xs:enumeration value="iOS"/>
                    <xs:enumeration value="Blackberry"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:all>
          </xs:complexType>
          <xs:keyref name="developerIDref" refer="developerID">
            <xs:selector xpath="."/>
            <xs:field xpath="Developer"/>
          </xs:keyref>
        </xs:element>
        <xs:element name="AppStat">
          <xs:complexType>
            <xs:all>
              <xs:element name="AppID" type="xs:anySimpleType"/>
              <xs:element name="Statistics">
                <xs:complexType>
                  <xs:sequence maxOccurs="unbounded">
                    <xs:element name="Platform" type="xs:anySimpleType"/>
                    <xs:element name="Downloads" type="xs:positiveInteger"/>
                    <xs:element name="Rating">
                      <xs:simpleType>
                        <xs:restriction base="xs:float">
                          <xs:minInclusive value="0.0"/>
                          <xs:maxInclusive value="5.0"/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="LastChecked" type="xs:date"/>
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:key name="developerID">
      <xs:selector xpath="Developer"/>
      <xs:field xpath="ID"/>
    </xs:key>
  </xs:element>

</xs:schema>
于 2012-11-19T19:42:07.183 回答