10.5. Modularita dokumentu, členění na fyzické části

Tak jak jsme již dříve uvedli, rozsáhlejší dokumenty není dobré psát do jednoho souboru, ale je vhodné je rozdělit do několika souborů dle logických částí dokumentu (zpravidla dle kapitol). V DocBooku za tímto účelem můžeme použít běžné XML nástroje.

Vkládání pomocí entit je první možností. Funguje tak, že celý externí soubor označíme jako entitu (např. &kapitola1; a tu pak vložíme na místo kam se má dosadit obsah daného souboru.

ikona
Příklad 10.4: Vkládání pomocí entit
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE book PUBLIC '-//OASIS//DTD DocBook XML V4.3//EN'
     'http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd'
 [
 <!ENTITY kapitola1 SYSTEM "kapitola1.xml">
 <!ENTITY kapitola2 SYSTEM "kapitola2.xml">
 ]>
<book lang="cs">
  <bookinfo>
    <title>Kniha</title>
  </bookinfo>
    &kapitola1;
    &kapitola2;
</book>

Přičemž soubory kapitola1.xml a kapitola2.xml vypadají takto:

ikona
Příklad 10.5: Struktura souboru „kapitola1.xml“
<chapter>
 <title>Kapitola 1</chapter>
 <para>Text kapitoly...</para>
</chapter>

Nevýhodou této metody je skutečnost, že vložený soubor již neobsahuje XML prolog se specifikací DTD a nelze tedy provádět jeho validaci.

Druhou a lepší volbou je vkládání pomocí technologie XInclude. Každý vložený soubor je pak řádným samostatným XML dokumentem, obsahující XML prolog i kořenový prvek a vše lze bez problémů validovat.

ikona
Příklad 10.6: Vkládání pomocí XInclude
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE book PUBLIC '-//OASIS//DTD DocBook XML V4.3//EN'
          'file:///c:/xml/docbook/dtd/docbookx.dtd'
[
<!ELEMENT xi:include (xi:fallback?) >
<!ATTLIST xi:include
    xmlns:xi   CDATA       #FIXED    "http://www.w3.org/2001/XInclude"
    href       CDATA       #REQUIRED
    parse      (xml|text)  "xml"
    encoding   CDATA       #IMPLIED >

<!ELEMENT xi:fallback ANY>
<!ATTLIST xi:fallback
    xmlns:xi   CDATA   #FIXED   "http://www.w3.org/2001/XInclude" >

<!ENTITY % local.chapter.class "| xi:include">
]>

<book lang="cs">
  <bookinfo>
    <title>Kniha</title>
    <xi:include href="kapitola1.xml"/>
    <xi:include href="kapitola2.xml"/>
</book>

Vložený soubor má pak DTD označující že jde o kapitolu.

ikona
Příklad 10.7: Struktura souboru „kapitola1.xml“
<!DOCTYPE chapter PUBLIC '-//OASIS//DTD DocBook XML V4.3//EN'
     'http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd'>
<chapter>
 <title>Kapitola 1</chapter>
 <para>Text kapitoly...</para>
</chapter>

Jak vidíme, musíme DTD hlavního dokumentu do kterého vkládáme ostatní obohatit o podporu XInclude spolu s definicí jmenného prostoru. Vlastní vložení pak již provádíme kdekoliv konstrukcí <xi:include href="soubor.xml"/>. Můžeme použít i několik atributů: encoding udává kódování vkládaného dokumentu a parse způsob zpracování vkládaného dokumentu (můžeme uvést parse="text" pro zabezpečení převodu všech „nebezpečných“ na entity).

Zkráceným způsobem vložení můžeme provést takto:

ikona
<xi:include
  xmlns:xi="http://www.w3.org/2001/XInclude" href="kapitola1.xml" />

Zároveň je nutno dokument nejprve zpracovat XSL procesorem, který umí dokumenty pomocí XInclude spojit do jednoho. Parser Xalan ani Saxon to bohužel neumí, ale dokáže to např. program xmllint.

> xmllint --xinclude --postvalid dokument.xml > vystup.xml

Tímto postupem z modulárního dokumentu dokument.xml vytvoříme jeden dokument vystup.xml, který můžeme pustit do Xalanu. Parametr -- postvalid zajistí validaci XML dokumentu po spojení všech XInclude části a vypíše případné chyby. Parametrem -valid můžeme dokument ještě před spojením XInclude.

Pomocí XInclude nemusíme dokument vkládat celý, ale třeba jen určitou část nebo sekci. Nejjednodušší způsob je použít její id.

ikona
<xi:xinclude href="kapitola1.xml#sekce1">

Mnohem více možností vkládání částí textu nám pak nabízí standardní XML technologie XPointer.

ikona
Poznámka:

Velmi podrobné informace o problematice modularity dokumentů lze získat z knihy [Sta-05].