XML Schema Design Pattern: Russian Doll, Salami Slice, Venetian Blind, and Garden of Eden
Russian Doll
The Russian Doll design approach has a schema structure mirroring the instance document structure, e.g., declare a Book element and within it declare a Title element followed by a Publisher element:
<xsd:element name="Book">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Title" type="xsd:string"/>
<xsd:element name="Publisher" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</element>
The instance document has all its components bundled together. Likewise, the schema is designed to bundle together all its element declarations.
Salami Slice
Salami Slice design disassembles the instance document into its individual components. In the schema, we define each component (as an element declaration), and then assemble them together:
<xsd:element name="Title" type="xsd:string"/>
<xsd:element name="Publisher" type="xsd:string"/>
<xsd:element name="Book">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Title"/>
<xsd:element ref="Publisher"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Note how the schema declared each component individually (Title, and Publisher) and then assembled them together in the creation of the Book component
Venetian Blind
Similar to the Russian Doll approach in that they both use a single global element. The Venetian Blind approach describes a modular approach by naming and defining all type definitions globally (as opposed to the Salami Slice approach which declares elements globally and types locally). Each globally defined type describes an individual "slat" and can be reused by other components. In addition, all the locally declared elements can be namespace qualified or namespace unqualified (the slats can be "opened" or "closed") depending on the elementFormDefault attribute setting at the top of the schema. If the namespace is unqualified then the local elements in the instance document must not be qualified with the prefix of the namespace.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Book" type="TN:BookType" maxOccurs="unbounded"/>
<xs:complexType name="BookType">
<xs:sequence>
<xs:element name="Title" type="xsd:string"/>
<xs:element name="Publisher"type="xsd:string"/>
<xs:element name="PeopleInvolved" type="TN:PeopleInvolvedType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PeopleInvolvedType">
<xs:sequence>
<xs:element name="Author"type="xsd:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Garden of Eden
The Garden of Eden design is a combination of Venetian Blind and Salami Slice. You define all the elements and types in the global namespace and refer to the elements as required.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="TargetNamespace" xmlns:TN="TargetNamespace"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="BookType">
<xs:sequence>
<xs:element ref="Title"/>
<xs:element ref="Publisher"/>
<xs:element ref="PeopleInvolved" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="PeopleInvolvedType">
<xs:sequence>
<xs:element ref="Author"/>
</xs:sequence>
</xs:complexType>
<xsd:element name="PeopleInvolved type="TN:PeopleInvolvedType"/>
<xs:element name="Title" type="xsd:string"/>
<xs:element name="Publisher"type="xsd:string"/>
<xs:element name="Author"type="xsd:string"/>
<xs:element name="Book" type="TN:BookType" maxOccurs="unbounded"/>
</xs:schema>
Because it exposes all its elements and types globally, Garden of Eden, like Salami Slice, is completely reusable. However, because Garden of Eden exposes multiple elements as global ones, there are many potential root elements.
Thursday, March 01, 2012
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment