![]() |
|
|
|||||||
![]() |
XML - In xml schema, what's the difference between attribute "final" and "block" in element "element" |
|
|
Thread Tools | Search this Thread |
|
|
#1 |
|
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 |
|
|
|
|
#2 |
|
Posts: n/a
|
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: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: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: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? |
|