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.
<?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:
<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.
<?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.
<!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:
<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
.
<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.
Velmi podrobné informace o problematice modularity dokumentů lze získat z knihy [Sta-05].