First Step - XML Schema
Our sample custom framework is very simple. The documents are either
articles
or books
, both composed of
sections
. The sections
may contain
titles
, paragraphs
, figures
,
tables
, and other sections
. 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, we define the structure of the sections. 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 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="b"/> <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
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.