XHTML, for example, defines its doctype via the following line:
<syntaxhighlight pre lang="xml">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
</syntaxhighlightpre>
Fetching <code>xhtml1-strict.dtd</code> from the W3C’s server obviously involves network traffic. When dealing with single files, this may seem tolerable, but importing large collections benefits from caching these resources. Depending on the remote server, you will experience significant speed improvements when caching DTDs locally.
A simple working example for XHTML might look like this:
<syntaxhighlight pre lang="xml">
<catalog prefer="system" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<rewriteSystem systemIdStartString="http://www.w3.org/TR/xhtml1/DTD/" rewritePrefix="file:///path/to/dtds/" />
</catalog>
</syntaxhighlightpre>
This rewrites all systemIds starting with: <code><nowiki>http://www.w3.org/TR/xhtml1/DTD/</nowiki></code> to <code>file:///path/to/dtds/</code>. For example, if the following XML file is parsed:
<syntaxhighlight pre lang="xml">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"/>
</syntaxhighlightpre>
The XHTML DTD <code>xhtml1-transitional.dtd</code> and all its linked resources will now be loaded from the specified path.
Consider a library of reusable XSLT stylesheets. For performance reasons, this library will be cached locally. However, the import URI for a given stylesheet should always be the same, independent of the accidental relative or absolute path that it is stored at locally. Example:
<syntaxhighlight pre lang="xml">
<xsl:import href="http://acme.com/xsltlib/acme2html/1.0/acme2html.xsl"/>
</syntaxhighlightpre>
The XSLT stylesheet might not even be available from this location. The URI serves as a canonical location identifier for this XSLT stylesheet. A local copy of the <code>acme2html/1.0/</code> directory is expected to reside somewhere, and the location of this directory relative to the local XML catalog file is specified in an entry in this catalog, like this:
<syntaxhighlight pre lang="xml">
<rewriteURI uriStartString="http://acme.com/xsltlib/acme2html/1.0/" rewritePrefix="../acmehtml10/"/>
</syntaxhighlightpre>
This way, XSLT import URIs don’t have to be adjusted for the relative or absolute locations of the XSLT library’s local copy.
By default, an error is raised if the catalog resolution fails. The runtime properties of the catalog resolver can be changed by setting system properties, either on startup…
<syntaxhighlight pre lang="perl">
java -Djavax.xml.catalog.resolve=continue ... org.basex.BaseX
</syntaxhighlightpre>
…or via XQuery:
<syntaxhighlight pre lang="'xquery"'>
Q{java:System}setProperty('javax.xml.catalog.resolve', 'continue'),
...
</syntaxhighlightpre>
See [https://docs.oracle.com/en/java/javase/11/core/xml-catalog-api1.html Java 11: XML Catalog API] for more information.
When using a catalog within an XQuery Module, the global <code>db:catalog</code> option may not be set in this module. You can set it via pragma instead:
<syntaxhighlight pre lang="'xquery"'>
(# db:catalog xmlcatalog/catalog.xml #) {
xslt:transform(db:get('acme_content')[1], '../acmecustom/acmehtml.xsl')
}
</syntaxhighlightpre>
It is assumed that this stylesheet <code>../acmecustom/acmehtml.xsl</code> (location relative to the current XQuery script or module) imports <code>acme2html/1.0/acme2html.xsl</code> by its canonical URI that will be resolved to a local URI by the catalog resolver.
As mentioned above, the Java resolver doesn’t work for XSLT include or import URIs when executing XSLT with Saxon. You can use Norman Walsh’s xmlresolver.org instead. The catalog location may be given as a path relative to the current working directory, as described above. When you want to specify it as an absolute path, this resolver expects a file URI, not a file system path. Example for setting it on Windows before executing one of the .bat scripts, such as bin\basexgui.bat:
<syntaxhighlight pre lang="bat">
set BASEX_JVM="-Dorg.basex.catalog=file:///c:/Users/Jane/path/to/catalog.xml"
</syntaxhighlightpre>
=Changelog=