xsschema elementFormDefault 屬性

按照慣例,elementFormDefault 總是設定為 qualified ,但讓我們看看它實際上做了什麼。

首先將 elementFormDefault 設定為 qualified。

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2017 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" 
           targetNamespace="http://base.com" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="MyBaseElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ChildA" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

示例 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2017 (https://www.liquid-technologies.com) -->
<b:MyBaseElement xmlns:b="http://base.com" 
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://base.com ElementFormDefault_qualified.xsd">
    <b:ChildA>string</b:ChildA>
</b:MyBaseElement>

請注意,元素 ChildA 也必須使用名稱空間 b 進行限定。

現在讓我們看一下將 elementFormDefault 設定為 unqualified。

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2017 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="unqualified" 
           targetNamespace="http://base.com" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="MyBaseElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ChildA" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

示例 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2017 (https://www.liquid-technologies.com) -->
<b:MyBaseElement xmlns:b="http://base.com" 
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://base.com ElementFormDefault_unqualified.xsd">
    <ChildA>string</ChildA>
</b:MyBaseElement>

請注意,這次只有全域性定義的元素 MyBaseElement 使用名稱空間 b 限定,內部元素 ChildA(在模式中定義)是不合格的。

在上一個示例中,我們看到全域性定義的元素必須在 XML 例項文件中進行限定,但在地方定義的元素不能。但這並不僅僅意味著根元素,如果你有全域性定義的引用元素,那麼它們也需要符合條件。

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2017 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="unqualified" 
           targetNamespace="http://base.com" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="MyBaseElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ChildA" type="xs:string" />
                <xs:element xmlns:q1="http://base.com" ref="q1:MyElement" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="MyElement" type="xs:string" />
</xs:schema>

示例 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2017 (https://www.liquid-technologies.com) -->
<b:MyBaseElement xmlns:b="http://base.com" 
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://base.com ElementFormDefault_unqualified.xsd">
    <ChildA>string</ChildA>
    <b:MyElement>string</b:MyElement>
</b:MyBaseElement>

請注意,MyElement 還需要進行全域性定義的限定。

總之,如果你將 elementFormDefault 設定為 qualified,那麼所有內容都需要使用名稱空間限定(通過名稱空間別名或通過設定預設的 namesapce xmlns =“…”)。然而,elementFormDefault 被設定為不合格,事情變得複雜,你需要對模式進行一些非常深入的檢查,以確定是否應該合格。

我假設這就是為什麼 elementFormDefault 始終設定為合格!