xsl-list
[Top] [All Lists]

RE: Xalan XSLT transformation using XML Catalog

2005-01-18 02:56:36
The URIResolver handles URIs appearing at the XSLT level, the EntityResolver
does the same for URIs appearing at the XML level. In your command line you
set both; in your Java application you have set the URIResolver but not the
EntityResolver.

To set an EntityResolver from a Java application, you need to create a
SAXSource rather than a stream source, to instantiate your own XMLReader
(the SAX parser), set the EntityResolver on the XMLReader, and then do
saxSource.setXMLReader().

Michael Kay
http://www.saxonica.com/
 

-----Original Message-----
From: Ivan(_dot_)Price(_at_)nt(_dot_)gov(_dot_)au 
[mailto:Ivan(_dot_)Price(_at_)nt(_dot_)gov(_dot_)au] 
Sent: 18 January 2005 07:10
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Xalan XSLT transformation using XML Catalog

Hi there,

I've been trying to get a Xalan XSLT transformation working 
with an XML 
catalog for a while now.

After reading around about the (newer version) classes 
needing to be in 
the jre/lib/endorsed directory (e.g. 
http://www.laurenwood.org/anyway/index.php?p=16) I have successfully 
gotten the following to work using Xalan 2.6.2 and the jdk 1.4:

java   org.apache.xalan.xslt.Process  -ENTITYRESOLVER 
org.apache.xml.resolver.tools.CatalogResolver -URIRESOLVER 
org.apache.xml.resolver.tools.CatalogResolver -out out.xml 
-in dd/in.xml 
-xsl the.xsl

The catalog is invoked and everything works fine. However, 
for scalability 
and reusability I am trying to build this into a class (i.e. 
no have to 
start this process 100 times for 100 xmls) and have written a 
little java 
class containing:

import org.apache.xml.resolver.tools.CatalogResolver;
import java.util.Properties;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

                TransformerFactory tFactory = 
TransformerFactory.newInstance();
                CatalogResolver resolver = new CatalogResolver();
                tFactory.setURIResolver(resolver);
                Transformer transformer = tFactory.newTransformer(new 
StreamSource(xslFile));
                transformer.setURIResolver(resolver);
                transformer.transform(new StreamSource(xmlFile), new 
StreamResult(new FileOutputStream(outFile)));

The catalog resolver sucessfully initialises.. i get the :
Parse catalog: file:/xxx/catalog.xml
Loading catalog: file:/xxx/catalog.xml
Default BASE: file:/xxx/catalog.xml
override: yes
OVERRIDE: yes

but it is never invoked during the parse of the input file, 
instead the 
transformer returns all sorts of http server errors and parse 
errors as it 
tries to get the (often missing/broken) dtds and entities. 
Note these are 
the same input files as are being successfully resolved using 
the command 
line method. Should there be an entity method on the transformer?

What is the point of the  tFactory.setURIResolver(resolver); 
method ? is 
this a bug or am I misusing it ?

I would rather the transformer not validate the XML before 
transforming 
it, allowing me to validate the result and reject the file at 
that stage 
if i choose to.

Thanks in advance..

-ivan

Ivan Price
Department of Infrastructure, Planning and Environment
Northern Territory Government
Tel: (08) 8924 4024
Fax: (08) 8924 4045
Email: ivan(_dot_)price(_at_)nt(_dot_)gov(_dot_)au


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>