Edit online

To illustrate an example of creating an XML Schema for a custom DocBook framework, suppose 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, 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 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.