Hi,
You can think of final as a development time restriction (applies to
schema itself) and of block as a runtime restriction (applies to schema
usage from the instance documents).
If you have final="restriction" (note that I made city optional to have
something to restrict)
<xs:complexType name="Address" final="restriction">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
then trying to create a type like below will fail with an error:
<xs:complexType name="RestrictedAddress">
<xs:complexContent>
<xs:restriction base="Address">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
But if you block restriction
<xs:complexType name="Address" block="restriction">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
then you can derive the RestrictedAddress type from it.
Let's assume further that you use block="restriction" and you have also
two element declarations in your schema as below:
<xs:element name="test1" type="Address"/>
<xs:element name="test2" type="RestrictedAddress"/>
Then, when you create instance documents you can have a valid instance
like:
<test1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<name></name>
<street></street>
<city></city>
</test1>
But if you want to use xsi:type to specify that test1 is actually of
the RestrictedAddress type:
<test1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd" xsi:type="RestrictedAddress">
<name></name>
<street></street>
</test1>
Then you will get an error as RestrictedAddress type cannot be used
instead of Address type because you blocked restriction for the Address
type. If you remove block="restriction" from the schema you can see
that the above instance becames valid.
But if you use test2 has RestrictedAddress as type then you get a valid
instance:
<test2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">
<name></name>
<street></street>
</test2>
Best Regards,
George
---------------------------------------------------------------------
George Cristian Bina
<oXygen/XML Editor, Schema Editor and XSLT Editor/Debugger
http://www.oxygenxml.com
tankbattle wrote:
That is, what's the difference between
<complexType name="Address" final="restriction">
<sequence>
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>
and
<complexType name="Address" block="restriction">
<sequence>
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>
in xml schema?