In xml schema, what's the difference between attribute "final" and "block" in element "element"

T

tankbattle

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?
 
G

George Bina

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,149
Latest member
Vinay Kumar Nevatia0
Top