Edit online

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.