Step 3: Create a Custom XML Schema
To illustrate an example of creating an XML Schema for a custom DocBook framework, suppose the documents are
either articles or books, and composed of sections. The sections
may contain <title>
, <para>
,
<figure>
, <table>
, and other
<section>
elements. To complete the picture, each section includes a
<def>
element from another namespace.
The first schema file:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.oxygenxml.com/sample/documentation"
xmlns:doc="http://www.oxygenxml.com/sample/documentation"
xmlns:abs="http://www.oxygenxml.com/sample/documentation/abstracts"
elementFormDefault="qualified">
<xs:import namespace=
"http://www.oxygenxml.com/sample/documentation/abstracts"
schemaLocation=
"abs.xsd"/>
The namespace of the documents will be
http://www.oxygenxml.com/sample/documentation
. The namespace of the
<def>
element is
http://www.oxygenxml.com/sample/documentation/abstracts
.
Next, the structure of the sections is defined. They all start with a
<title>
, then have the optional <def>
element
then either a sequence of other sections, or a mixture of paragraphs, images, and tables.
<xs:element name="book" type="doc:sectionType"/>
<xs:element name="article" type="doc:sectionType"/>
<xs:element name="section" type="doc:sectionType"/>
<xs:complexType name="sectionType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element ref="abs:def" minOccurs="0"/>
<xs:choice>
<xs:sequence>
<xs:element ref="doc:section" maxOccurs="unbounded"/>
</xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element ref="doc:para"/>
<xs:element ref="doc:image"/>
<xs:element ref="doc:table"/>
</xs:choice>
</xs:choice>
</xs:sequence>
</xs:complexType>
The paragraph contains text and other custom styling markup, such as bold
(<b>
) and italic (<i>
) elements.
<xs:element name="para" type="doc:paragraphType"/>
<xs:complexType name="paragraphType" mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="emphasis"/>
<xs:element name="i"/>
</xs:choice>
</xs:complexType>
The <image>
element has an attribute with a reference to the file
containing image data.
<xs:element name="image">
<xs:complexType>
<xs:attribute name="href" type="xs:anyURI" use="required"/>
</xs:complexType>
</xs:element>
The <table>
element contains a header row and then a sequence of rows
(<tr>
elements) each of them containing the cells. Each cell has the
same content as the paragraphs.
<xs:element name="table">
<xs:complexType>
<xs:sequence>
<xs:element name="header">
<xs:complexType>
<xs:sequence>
<xs:element name="td" maxOccurs="unbounded"
type="doc:paragraphType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="tr" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="td" type="doc:tdType"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="tdType">
<xs:complexContent>
<xs:extension base="doc:paragraphType">
<xs:attribute name="row_span" type="xs:integer"/>
<xs:attribute name="column_span" type="xs:integer"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
The <def>
element is defined as a text only element in the imported
schema abs.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace=
"http://www.oxygenxml.com/sample/documentation/abstracts">
<xs:element name="def" type="xs:string"/>
</xs:schema>
Now the XML data structure will be styled.