URI Reference
Use a uri
entry to find a desired resource.
The URI type entries, including uri
, rewriteURI
, and uriSuffix
, can be used in a similar way as the system type entries.
Using URI Entries
While the XML Catalog Standard gives a preference to the system
type entries for resolving DTD references, and uri
type entries for everything else, the Java XML Catalog API doesn’t make that distinction. This is because the specifications for the existing Java XML Resolvers, such as XMLResolver
and LSResourceResolver
, doesn’t give a preference. The uri
type entries, including uri
, rewriteURI
, and uriSuffix
, can be used in a similar way as the system
type entries. The uri
elements are defined to associate an alternate URI reference with a URI reference. In the case of system
reference, this is the systemId
property.
You may therefore replace the system
entry with a uri
entry in the following example, although system
entries are more generally used for DTD references.
<system
systemId="http://openjdk.java.net/xml/catalog/dtd/example.dtd"
uri="example.dtd"/>
A uri
entry would look like the following:
<uri name="http://openjdk.java.net/xml/catalog/dtd/example.dtd" uri="example.dtd"/>
While system
entries are frequently used for DTDs, uri
entries are preferred for URI references such as XSD and XSL import and include. The next example uses a uri
entry to resolve a XSL import.
As described in XML Catalog API Interfaces, the XML Catalog API defines the CatalogResolver
interface that extends Java XML Resolvers including EntityResolver
, XMLResolver
, URIResolver
, and LSResolver
. Therefore, a CatalogResolver
object can be used by SAX, DOM, StAX, Schema Validation, as well as XSLT Transform. The following code creates a CatalogResolver
object with default feature settings:
CatalogResolver cr =
CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogUri);
The code then registers this CatalogResolver
object on a TransformerFactory
class where a URIResolver
object is expected:
TransformerFactory factory = TransformerFactory.newInstance();
factory.setURIResolver(cr);
Alternatively the code can register the CatalogResolver
object on the Transformer
object:
Transformer transformer = factory.newTransformer(xslSource);
transformer.setURIResolver(cur);
Assuming the XSL source file contains an import
element to import the xslImport.xsl
file into the XSL source:
<xsl:import href="pathto/xslImport.xsl"/>
To resolve the import
reference to where the import file is actually located, a CatalogResolver
object should be set on the TransformerFactory
class before creating the Transformer
object, and a uri
entry such as the following must be added to the catalog entry file:
<uri name="pathto/xslImport.xsl" uri="xslImport.xsl"/>
The discussion about absolute or relative URIs and the use of systemSuffix
or uriSuffix
entries with the system reference applies to the uri
entries as well.