如果想了解更多,可以参考http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/#PO
1. 全局元素和局部元素
在讨论elementFormDefault属性之前,先让我们认识一下在一个xsd文件中,什么元素称为全局元素,什么元素称为局部元素
示例:
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
- <xs:element name="purchaseOrder" type="PurchaseOrderType"/>
- <xs:element namexs:elementname="comment" type="xs:string"/>
- <xs:complexType name="PurchaseOrderType">
- <xs:sequence>
- <xs:element name="shipTo" type="xs:string"/>
- <xs:element name="billTo" type="xs:string"/>
- <xs:element ref="comment" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- </xs:schema>
此例中,第3,4,6行是全局元素声明,8,9行是局部元素。可以这么说,<schema>的直接子元素称为全局元素,嵌套在其他元素中的元素称为局部元素。
2. elementFormDefault属性的值与作用域
值:
elementFormDefault=”qualified” 或者elementFormDefault=”unqualified” |
作用域:
只对局部元素起作用,也就是说:不管elementFormDefault为何值,如果指定了<schema>标签属性targetNamespace的值,所有全局元素都将归于该targetNamespace所指定的命名空间。如果elementFormDefault="qualified",所有的局部元素也都归于targetNamespace指定的命名空间,如果elementFormDefault="unqualified",则局部元素没有命名空间 |
elmentFormDefault | 全局元素 | 局部元素 |
qualified | 属于<schema>标签属性targetNamespace指定的命名空间,如果对该命名空间指定了前缀,则使用元素时,必须加前缀 | 属于<schema>标签属性targetNamespace指定的命名空间,如果对该命名空间指定了前缀,则使用元素时,必须加前缀 |
unqualified | 属于<schema>标签属性targetNamespace指定的命名空间,如果对该命名空间指定了前缀,则使用元素时,必须加前缀 | 无命名空间,使用元素时,无需任何前缀 |
我们看下面的一个例子po1.xsd
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
- xmlns:po="http://www.example.com/PO1"
- targetNamespace="http://www.example.com/PO1"
- elementFormDefault=" qualified ">
- <xs:element name="purchaseOrder" type="po:PurchaseOrderType"/>
- <xs:element name="comment" type="xs:string"/>
- <xs:complexType name="PurchaseOrderType">
- <xs:sequence>
- <xs:element name="shipTo" type="po:USAAddress"/>
- <xs:element name="billTo" type="po:USAAddress"/>
- <xs:element ref="po:comment" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="USAAddress">
- <xs:sequence>
- <xs:element name="name" type="xs:string"/>
- <xs:element name="street" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- </xs:schema>
在此xsd文件中,我们定义了(注意加了前缀的引用该xsd文件的全局元素。在<schema>中你对targetNamespace指定的命名空间指定了前缀po)
targetNamespace=” http://www.example.com/PO1” elementFormDefualt=” qualified”
对应的xml实例po1.xml
- <?xml version="1.0"?>
- <apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
- orderDate="2012-02-09">
- <apo:shipTo>
- <apo:name>Alice Smith</apo:name>
- <apo:street>123 Maple Street</apo:street>
- </apo:shipTo>
- <apo:billTo>
- <apo:name>Robert Smith</apo:name>
- <apo:street>8 Oak Avenue</apo:street>
- </apo:billTo>
- <apo:comment>Hurry, my lawn is going wild</apo:comment>
- </apo:purchaseOrder></span>
(注意到无论是全局元素的使用还是局部元素的使用都加了前缀,前缀apo是通过xmlns:apo=”http://www.example.com/PO1”指定的)
再来看一个例子po2.xsd(此例修改po1.xsd中的elementFormDefault=” unqualified”)
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
- xmlns:po="http://www.example.com/PO1"
- targetNamespace="http://www.example.com/PO1"
- elementFormDefault=" qualified ">
- <xs:element name="purchaseOrder" type="po:PurchaseOrderType"/>
- <xs:element name="comment" type="xs:string"/>
- <xs:complexType name="PurchaseOrderType">
- <xs:sequence>
- <xs:element name="shipTo" type="po:USAAddress"/>
- <xs:element name="billTo" type="po:USAAddress"/>
- <xs:element ref="po:comment" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="USAAddress">
- <xs:sequence>
- <xs:element name="name" type="xs:string"/>
- <xs:element name="street" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- </xs:schema></span>
对应的xml实例po2.xml
- <?xml version="1.0"?>
- <apo:purchaseOrder xmlns:apo="http://www.example.com/PO1"
- orderDate="2012-02-09">
- <shipTo>
- <name>Alice Smith</name>
- <street>123 Maple Street</street>
- </shipTo>
- <billTo>
- <name>Robert Smith</name>
- <street>8 Oak Avenue</street>
- </billTo>
- <apo:comment>Hurry, my lawn is going wild</apo:comment>
- </apo:purchaseOrder></span>
(注意到只对xsd文件中的全局元素的使用加了前缀,前缀apo是通过xmlns:apo=” http://www.example.com/PO1”指定的)