我定义了两个复杂的元素类型 – Developer和App.
开发者孩子 – 身份证,姓名,电子邮件
应用程序子项 – ID,名称,开发人员
这里的Developer in App复杂元素指的是Developer / ID.
如何在xml架构中定义此关系.我正在使用XML spy2013编辑器.
我已尝试在简单类型Developer-> ID的声明中指定name.并在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>
为开发人员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只能包含appinfo / Developer / ID中声明的开发人员ID之一.为此,必须使用xs:key创建唯一键定义,并使用xs:keyref引用它(请参阅here).
这是完整的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>