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

Discussion in 'XML' started by tankbattle, Jul 20, 2006.

  1. tankbattle

    tankbattle Guest

    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?
     
    tankbattle, Jul 20, 2006
    #1
    1. Advertising

  2. tankbattle

    George Bina Guest

    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?
     
    George Bina, Jul 21, 2006
    #2
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page