catalog.html revision 373a4758b7139b5605f51a1f9dbc74bffe7b5151
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"> 2<html> 3<head> 4<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type"> 5<style type="text/css"><!-- 6TD {font-family: Verdana,Arial,Helvetica} 7BODY {font-family: Verdana,Arial,Helvetica; margin-top: 2em; margin-left: 0em; margin-right: 0em} 8H1 {font-family: Verdana,Arial,Helvetica} 9H2 {font-family: Verdana,Arial,Helvetica} 10H3 {font-family: Verdana,Arial,Helvetica} 11A:link, A:visited, A:active { text-decoration: underline } 12--></style> 13<title>Catalog support</title> 14</head> 15<body bgcolor="#8b7765" text="#000000" link="#000000" vlink="#000000"> 16<table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr> 17<td width="180"> 18<a href="http://www.gnome.org/"><img src="smallfootonly.gif" alt="Gnome Logo"></a><a href="http://www.w3.org/Status"><img src="w3c.png" alt="W3C Logo"></a><a href="http://www.redhat.com/"><img src="redhat.gif" alt="Red Hat Logo"></a> 19</td> 20<td><table border="0" width="90%" cellpadding="2" cellspacing="0" align="center" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3" bgcolor="#fffacd"><tr><td align="center"> 21<h1>The XML C library for Gnome</h1> 22<h2>Catalog support</h2> 23</td></tr></table></td></tr></table></td> 24</tr></table> 25<table border="0" cellpadding="4" cellspacing="0" width="100%" align="center"><tr><td bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr> 26<td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td> 27<table width="100%" border="0" cellspacing="1" cellpadding="3"> 28<tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Main Menu</b></center></td></tr> 29<tr><td bgcolor="#fffacd"><ul> 30<li><a href="index.html">Home</a></li> 31<li><a href="intro.html">Introduction</a></li> 32<li><a href="FAQ.html">FAQ</a></li> 33<li><a href="docs.html">Documentation</a></li> 34<li><a href="bugs.html">Reporting bugs and getting help</a></li> 35<li><a href="help.html">How to help</a></li> 36<li><a href="downloads.html">Downloads</a></li> 37<li><a href="news.html">News</a></li> 38<li><a href="XMLinfo.html">XML</a></li> 39<li><a href="XSLT.html">XSLT</a></li> 40<li><a href="python.html">Python and bindings</a></li> 41<li><a href="architecture.html">libxml architecture</a></li> 42<li><a href="tree.html">The tree output</a></li> 43<li><a href="interface.html">The SAX interface</a></li> 44<li><a href="xmldtd.html">Validation & DTDs</a></li> 45<li><a href="xmlmem.html">Memory Management</a></li> 46<li><a href="encoding.html">Encodings support</a></li> 47<li><a href="xmlio.html">I/O Interfaces</a></li> 48<li><a href="catalog.html">Catalog support</a></li> 49<li><a href="library.html">The parser interfaces</a></li> 50<li><a href="entities.html">Entities or no entities</a></li> 51<li><a href="namespaces.html">Namespaces</a></li> 52<li><a href="upgrade.html">Upgrading 1.x code</a></li> 53<li><a href="threads.html">Thread safety</a></li> 54<li><a href="DOM.html">DOM Principles</a></li> 55<li><a href="example.html">A real example</a></li> 56<li><a href="contribs.html">Contributions</a></li> 57<li> 58<a href="xml.html">flat page</a>, <a href="site.xsl">stylesheet</a> 59</li> 60</ul></td></tr> 61</table> 62<table width="100%" border="0" cellspacing="1" cellpadding="3"> 63<tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>API Indexes</b></center></td></tr> 64<tr><td bgcolor="#fffacd"><ul> 65<li><a href="APIchunk0.html">Alphabetic</a></li> 66<li><a href="APIconstructors.html">Constructors</a></li> 67<li><a href="APIfunctions.html">Functions/Types</a></li> 68<li><a href="APIfiles.html">Modules</a></li> 69<li><a href="APIsymbols.html">Symbols</a></li> 70</ul></td></tr> 71</table> 72<table width="100%" border="0" cellspacing="1" cellpadding="3"> 73<tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr> 74<tr><td bgcolor="#fffacd"><ul> 75<li><a href="http://mail.gnome.org/archives/xml/">Mail archive</a></li> 76<li><a href="http://xmlsoft.org/XSLT/">XSLT libxslt</a></li> 77<li><a href="http://phd.cs.unibo.it/gdome2/">DOM gdome2</a></li> 78<li><a href="ftp://xmlsoft.org/">FTP</a></li> 79<li><a href="http://www.fh-frankfurt.de/~igor/projects/libxml/">Windows binaries</a></li> 80<li><a href="http://garypennington.net/libxml2/">Solaris binaries</a></li> 81<li><a href="http://bugzilla.gnome.org/buglist.cgi?product=libxml">Bug Tracker</a></li> 82</ul></td></tr> 83</table> 84</td></tr></table></td> 85<td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"> 86<p>Table of Content:</p> 87<ol> 88<li><a href="General2">General overview</a></li> 89<li><a href="#definition">The definition</a></li> 90<li><a href="#Simple">Using catalogs</a></li> 91<li><a href="#Some">Some examples</a></li> 92<li><a href="#reference">How to tune catalog usage</a></li> 93<li><a href="#validate">How to debug catalog processing</a></li> 94<li><a href="#Declaring">How to create and maintain catalogs</a></li> 95<li><a href="#implemento">The implementor corner quick review of the 96 API</a></li> 97<li><a href="#Other">Other resources</a></li> 98</ol> 99<h3><a name="General2">General overview</a></h3> 100<p>What is a catalog? Basically it's a lookup mechanism used when an entity 101(a file or a remote resource) references another entity. The catalog lookup 102is inserted between the moment the reference is recognized by the software 103(XML parser, stylesheet processing, or even images referenced for inclusion 104in a rendering) and the time where loading that resource is actually 105started.</p> 106<p>It is basically used for 3 things:</p> 107<ul> 108<li>mapping from "logical" names, the public identifiers and a more 109 concrete name usable for download (and URI). For example it can associate 110 the logical name 111 <p>"-//OASIS//DTD DocBook XML V4.1.2//EN"</p> 112<p>of the DocBook 4.1.2 XML DTD with the actual URL where it can be 113 downloaded</p> 114<p>http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd</p> 115</li> 116<li>remapping from a given URL to another one, like an HTTP indirection 117 saying that 118 <p>"http://www.oasis-open.org/committes/tr.xsl"</p> 119<p>should really be looked at</p> 120<p>"http://www.oasis-open.org/committes/entity/stylesheets/base/tr.xsl"</p> 121</li> 122<li>providing a local cache mechanism allowing to load the entities 123 associated to public identifiers or remote resources, this is a really 124 important feature for any significant deployment of XML or SGML since it 125 allows to avoid the aleas and delays associated to fetching remote 126 resources.</li> 127</ul> 128<h3><a name="definition">The definitions</a></h3> 129<p>Libxml, as of 2.4.3 implements 2 kind of catalogs:</p> 130<ul> 131<li>the older SGML catalogs, the official spec is SGML Open Technical 132 Resolution TR9401:1997, but is better understood by reading <a href="http://www.jclark.com/sp/catalog.htm">the SP Catalog page</a> from 133 James Clark. This is relatively old and not the preferred mode of 134 operation of libxml.</li> 135<li> 136<a href="http://www.oasis-open.org/committees/entity/spec.html">XML 137 Catalogs</a> 138 is far more flexible, more recent, uses an XML syntax and should scale 139 quite better. This is the default option of libxml.</li> 140</ul> 141<p> 142<h3><a name="Simple">Using catalog</a></h3> 143<p>In a normal environment libxml will by default check the presence of a 144catalog in /etc/xml/catalog, and assuming it has been correctly populated, 145the processing is completely transparent to the document user. To take a 146concrete example, suppose you are authoring a DocBook document, this one 147starts with the following DOCTYPE definition:</p> 148<pre><?xml version='1.0'?> 149<!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V3.1.4//EN" 150 "http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd"></pre> 151<p>When validating the document with libxml, the catalog will be 152automatically consulted to lookup the public identifier "-//Norman Walsh//DTD 153DocBk XML V3.1.4//EN" and the system identifier 154"http://nwalsh.com/docbook/xml/3.1.4/db3xml.dtd", and if these entities have 155been installed on your system and the catalogs actually point to them, libxml 156will fetch them from the local disk.</p> 157<p style="font-size: 10pt"> 158<strong>Note</strong>: Really don't use this 159DOCTYPE example it's a really old version, but is fine as an example.</p> 160<p>Libxml will check the catalog each time that it is requested to load an 161entity, this includes DTD, external parsed entities, stylesheets, etc ... If 162your system is correctly configured all the authoring phase and processing 163should use only local files, even if your document stays portable because it 164uses the canonical public and system ID, referencing the remote document.</p> 165<h3><a name="Some">Some examples:</a></h3> 166<p>Here is a couple of fragments from XML Catalogs used in libxml early 167regression tests in <code>test/catalogs</code> :</p> 168<pre><?xml version="1.0"?> 169<!DOCTYPE catalog PUBLIC 170 "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" 171 "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"> 172<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 173 <public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN" 174 uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/> 175...</pre> 176<p>This is the beginning of a catalog for DocBook 4.1.2, XML Catalogs are 177written in XML, there is a specific namespace for catalog elements 178"urn:oasis:names:tc:entity:xmlns:xml:catalog". The first entry in this 179catalog is a <code>public</code> mapping it allows to associate a Public 180Identifier with an URI.</p> 181<pre>... 182 <rewriteSystem systemIdStartString="http://www.oasis-open.org/docbook/" 183 rewritePrefix="file:///usr/share/xml/docbook/"/> 184...</pre> 185<p>A <code>rewriteSystem</code> is a very powerful instruction, it says that 186any URI starting with a given prefix should be looked at another URI 187constructed by replacing the prefix with an new one. In effect this acts like 188a cache system for a full area of the Web. In practice it is extremely useful 189with a file prefix if you have installed a copy of those resources on your 190local system.</p> 191<pre>... 192<delegatePublic publicIdStartString="-//OASIS//DTD XML Catalog //" 193 catalog="file:///usr/share/xml/docbook.xml"/> 194<delegatePublic publicIdStartString="-//OASIS//ENTITIES DocBook XML" 195 catalog="file:///usr/share/xml/docbook.xml"/> 196<delegatePublic publicIdStartString="-//OASIS//DTD DocBook XML" 197 catalog="file:///usr/share/xml/docbook.xml"/> 198<delegateSystem systemIdStartString="http://www.oasis-open.org/docbook/" 199 catalog="file:///usr/share/xml/docbook.xml"/> 200<delegateURI uriStartString="http://www.oasis-open.org/docbook/" 201 catalog="file:///usr/share/xml/docbook.xml"/> 202...</pre> 203<p>Delegation is the core features which allows to build a tree of catalogs, 204easier to maintain than a single catalog, based on Public Identifier, System 205Identifier or URI prefixes it instructs the catalog software to look up 206entries in another resource. This feature allow to build hierarchies of 207catalogs, the set of entries presented should be sufficient to redirect the 208resolution of all DocBook references to the specific catalog in 209<code>/usr/share/xml/docbook.xml</code> this one in turn could delegate all 210references for DocBook 4.2.1 to a specific catalog installed at the same time 211as the DocBook resources on the local machine.</p> 212<h3><a name="reference">How to tune catalog usage:</a></h3> 213<p>The user can change the default catalog behaviour by redirecting queries 214to its own set of catalogs, this can be done by setting the 215<code>XML_CATALOG_FILES</code> environment variable to a list of catalogs, an 216empty one should deactivate loading the default <code>/etc/xml/catalog</code> 217default catalog</p> 218<h3><a name="validate">How to debug catalog processing:</a></h3> 219<p>Setting up the <code>XML_DEBUG_CATALOG</code> environment variable will 220make libxml output debugging informations for each catalog operations, for 221example:</p> 222<pre>orchis:~/XML -> xmllint --memory --noout test/ent2 223warning: failed to load external entity "title.xml" 224orchis:~/XML -> export XML_DEBUG_CATALOG= 225orchis:~/XML -> xmllint --memory --noout test/ent2 226Failed to parse catalog /etc/xml/catalog 227Failed to parse catalog /etc/xml/catalog 228warning: failed to load external entity "title.xml" 229Catalogs cleanup 230orchis:~/XML -> </pre> 231<p>The test/ent2 references an entity, running the parser from memory makes 232the base URI unavailable and the the "title.xml" entity cannot be loaded. 233Setting up the debug environment variable allows to detect that an attempt is 234made to load the <code>/etc/xml/catalog</code> but since it's not present the 235resolution fails.</p> 236<p>But the most advanced way to debug XML catalog processing is to use the 237<strong>xmlcatalog</strong> command shipped with libxml2, it allows to load 238catalogs and make resolution queries to see what is going on. This is also 239used for the regression tests:</p> 240<pre>orchis:~/XML -> /xmlcatalog test/catalogs/docbook.xml \ 241 "-//OASIS//DTD DocBook XML V4.1.2//EN" 242http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd 243orchis:~/XML -> </pre> 244<p>For debugging what is going on, adding one -v flags increase the verbosity 245level to indicate the processing done (adding a second flag also indicate 246what elements are recognized at parsing):</p> 247<pre>orchis:~/XML -> /xmlcatalog -v test/catalogs/docbook.xml \ 248 "-//OASIS//DTD DocBook XML V4.1.2//EN" 249Parsing catalog test/catalogs/docbook.xml's content 250Found public match -//OASIS//DTD DocBook XML V4.1.2//EN 251http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd 252Catalogs cleanup 253orchis:~/XML -> </pre> 254<p>A shell interface is also available to debug and process multiple queries 255(and for regression tests):</p> 256<pre>orchis:~/XML -> /xmlcatalog -shell test/catalogs/docbook.xml \ 257 "-//OASIS//DTD DocBook XML V4.1.2//EN" 258> help 259Commands available: 260public PublicID: make a PUBLIC identifier lookup 261system SystemID: make a SYSTEM identifier lookup 262resolve PublicID SystemID: do a full resolver lookup 263add 'type' 'orig' 'replace' : add an entry 264del 'values' : remove values 265dump: print the current catalog state 266debug: increase the verbosity level 267quiet: decrease the verbosity level 268exit: quit the shell 269> public "-//OASIS//DTD DocBook XML V4.1.2//EN" 270http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd 271> quit 272orchis:~/XML -> </pre> 273<p>This should be sufficient for most debugging purpose, this was actually 274used heavily to debug the XML Catalog implementation itself.</p> 275<h3> 276<a name="Declaring">How to create and maintain</a> catalogs:</h3> 277<p>Basically XML Catalogs are XML files, you can either use XML tools to 278manage them or use <strong>xmlcatalog</strong> for this. The basic step is 279to create a catalog the -create option provide this facility:</p> 280<pre>orchis:~/XML -> /xmlcatalog --create tst.xml 281<?xml version="1.0"?> 282<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" 283 "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"> 284<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/> 285orchis:~/XML -> </pre> 286<p>By default xmlcatalog does not overwrite the original catalog and save the 287result on the standard output, this can be overridden using the -noout 288option. The <code>-add</code> command allows to add entries in the 289catalog:</p> 290<pre>orchis:~/XML -> /xmlcatalog --noout --create --add "public" \ 291 "-//OASIS//DTD DocBook XML V4.1.2//EN" \ 292 http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd tst.xml 293orchis:~/XML -> cat tst.xml 294<?xml version="1.0"?> 295<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" \ 296 "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"> 297<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 298<public publicId="-//OASIS//DTD DocBook XML V4.1.2//EN" 299 uri="http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/> 300</catalog> 301orchis:~/XML -> </pre> 302<p>The <code>-add</code> option will always take 3 parameters even if some of 303the XML Catalog constructs (like nextCatalog) will have only a single 304argument, just pass a third empty string, it will be ignored.</p> 305<p>Similarly the <code>-del</code> option remove matching entries from the 306catalog:</p> 307<pre>orchis:~/XML -> /xmlcatalog --del \ 308 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" tst.xml 309<?xml version="1.0"?> 310<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" 311 "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"> 312<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"/> 313orchis:~/XML -> </pre> 314<p>The catalog is now empty. Note that the matching of <code>-del</code> is 315exact and would have worked in a similar fashion with the Public ID 316string.</p> 317<p>This is rudimentary but should be sufficient to manage a not too complex 318catalog tree of resources.</p> 319<h3><a name="implemento">The implementor corner quick review of the 320API:</a></h3> 321<p>First, and like for every other module of libxml, there is an 322automatically generated <a href="html/libxml-catalog.html">API page for 323catalog support</a>.</p> 324<p>The header for the catalog interfaces should be included as:</p> 325<pre>#include <libxml/catalog.h></pre> 326<p>The API is voluntarily kept very simple. First it is not obvious that 327applications really need access to it since it is the default behaviour of 328libxml (Note: it is possible to completely override libxml default catalog by 329using <a href="html/libxml-parser.html">xmlSetExternalEntityLoader</a> to 330plug an application specific resolver).</p> 331<p>Basically libxml support 2 catalog lists:</p> 332<ul> 333<li>the default one, global shared by all the application</li> 334<li>a per-document catalog, this one is built if the document uses the 335 <code>oasis-xml-catalog</code> PIs to specify its own catalog list, it is 336 associated to the parser context and destroyed when the parsing context 337 is destroyed.</li> 338</ul> 339<p>the document one will be used first if it exists.</p> 340<h4>Initialization routines:</h4> 341<p>xmlInitializeCatalog(), xmlLoadCatalog() and xmlLoadCatalogs() should be 342used at startup to initialize the catalog, if the catalog should be 343initialized with specific values xmlLoadCatalog() or xmlLoadCatalogs() 344should be called before xmlInitializeCatalog() which would otherwise do a 345default initialization first.</p> 346<p>The xmlCatalogAddLocal() call is used by the parser to grow the document 347own catalog list if needed.</p> 348<h4>Preferences setup:</h4> 349<p>The XML Catalog spec requires the possibility to select default 350preferences between public and system delegation, 351xmlCatalogSetDefaultPrefer() allows this, xmlCatalogSetDefaults() and 352xmlCatalogGetDefaults() allow to control if XML Catalogs resolution should 353be forbidden, allowed for global catalog, for document catalog or both, the 354default is to allow both.</p> 355<p>And of course xmlCatalogSetDebug() allows to generate debug messages 356(through the xmlGenericError() mechanism).</p> 357<h4>Querying routines:</h4> 358<p>xmlCatalogResolve(), xmlCatalogResolveSystem(), xmlCatalogResolvePublic() 359and xmlCatalogResolveURI() are relatively explicit if you read the XML 360Catalog specification they correspond to section 7 algorithms, they should 361also work if you have loaded an SGML catalog with a simplified semantic.</p> 362<p>xmlCatalogLocalResolve() and xmlCatalogLocalResolveURI() are the same but 363operate on the document catalog list</p> 364<h4>Cleanup and Miscellaneous:</h4> 365<p>xmlCatalogCleanup() free-up the global catalog, xmlCatalogFreeLocal() is 366the per-document equivalent.</p> 367<p>xmlCatalogAdd() and xmlCatalogRemove() are used to dynamically modify the 368first catalog in the global list, and xmlCatalogDump() allows to dump a 369catalog state, those routines are primarily designed for xmlcatalog, I'm not 370sure that exposing more complex interfaces (like navigation ones) would be 371really useful.</p> 372<p>The xmlParseCatalogFile() is a function used to load XML Catalog files, 373it's similar as xmlParseFile() except it bypass all catalog lookups, it's 374provided because this functionality may be useful for client tools.</p> 375<h4>threaded environments:</h4> 376<p>Since the catalog tree is built progressively, some care has been taken to 377try to avoid troubles in multithreaded environments. The code is now thread 378safe assuming that the libxml library has been compiled with threads 379support.</p> 380<p> 381<h3><a name="Other">Other resources</a></h3> 382<p>The XML Catalog specification is relatively recent so there isn't much 383literature to point at:</p> 384<ul> 385<li>You can find an good rant from Norm Walsh about <a href="http://www.arbortext.com/Think_Tank/XML_Resources/Issue_Three/issue_three.html">the 386 need for catalogs</a>, it provides a lot of context informations even if 387 I don't agree with everything presented.</li> 388<li>An <a href="http://home.ccil.org/~cowan/XML/XCatalog.html">old XML 389 catalog proposal</a> from John Cowan</li> 390<li>The <a href="http://www.rddl.org/">Resource Directory Description 391 Language</a> (RDDL) another catalog system but more oriented toward 392 providing metadata for XML namespaces.</li> 393<li>the page from the OASIS Technical <a href="http://www.oasis-open.org/committees/entity/">Committee on Entity 394 Resolution</a> who maintains XML Catalog, you will find pointers to the 395 specification update, some background and pointers to others tools 396 providing XML Catalog support</li> 397<li>Here is a <a href="buildDocBookCatalog">shell script</a> to generate 398 XML Catalogs for DocBook 4.1.2 . If it can write to the /etc/xml/ 399 directory, it will set-up /etc/xml/catalog and /etc/xml/docbook based on 400 the resources found on the system. Otherwise it will just create 401 ~/xmlcatalog and ~/dbkxmlcatalog and doing: 402 <p><code>export XMLCATALOG=$HOME/xmlcatalog</code></p> 403<p>should allow to process DocBook documentations without requiring 404 network accesses for the DTd or stylesheets</p> 405</li> 406<li>I have uploaded <a href="ftp://xmlsoft.org/test/dbk412catalog.tar.gz">a 407 small tarball</a> containing XML Catalogs for DocBook 4.1.2 which seems 408 to work fine for me too</li> 409<li>The <a href="http://www.xmlsoft.org/xmlcatalog_man.html">xmlcatalog 410 manual page</a> 411</li> 412</ul> 413<p>If you have suggestions for corrections or additions, simply contact 414me:</p> 415<p><a href="bugs.html">Daniel Veillard</a></p> 416</td></tr></table></td></tr></table></td></tr></table></td> 417</tr></table></td></tr></table> 418</body> 419</html> 420