morten 01/08/14 02:16:45
Modified: java/src/org/apache/xalan/xsltc/cmdline Transform.java
java/src/org/apache/xalan/xsltc/compiler Output.java
java/src/org/apache/xalan/xsltc/runtime DefaultRun.java
DefaultSAXOutputHandler.java TextOutput.java
java/src/org/apache/xalan/xsltc/trax TransformerImpl.java
Log:
Implemented support for the doctype-system and doctype-public attributes
of the <xsl:output/> element. The translet post-processor (TextOutput) can
now be instanciated with a ContentHandler and an optional LexicalHandler.
The LexicalHandler will receive notofications of the DOCTYPE declaration.
The default SAX output handler now implements both ContentHandler and
LexicalHandler. The LexicalHandler only handles the startDTD() method,
by outputting the DOCTYPE declaration, and all other methods are empty.
The trax.Transformer implementation has also been updated to use the
LexicalHandler, but I still have not found any way in which a SAX client
can set the LexicalHandler.
PR: bugzilla 1504
Obtained from: n/a
Submitted by: [EMAIL PROTECTED]
Reviewed by: [EMAIL PROTECTED]
Revision Changes Path
1.4 +11 -5
xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java
Index: Transform.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- Transform.java 2001/07/20 18:52:09 1.3
+++ Transform.java 2001/08/14 09:16:45 1.4
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Transform.java,v 1.3 2001/07/20 18:52:09 amiro Exp $
+ * @(#)$Id: Transform.java,v 1.4 2001/08/14 09:16:45 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -77,6 +77,8 @@
import org.xml.sax.XMLReader;
import org.xml.sax.SAXException;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.ext.LexicalHandler;
import org.apache.xalan.xsltc.DOM;
import org.apache.xalan.xsltc.Translet;
@@ -169,10 +171,14 @@
// Transform the document
String encoding = _translet._encoding;
- //TextOutput textOutput = new TextOutput(System.out, encoding);
- DefaultSAXOutputHandler saxHandler = new
- DefaultSAXOutputHandler(System.out, encoding);
- TextOutput textOutput = new TextOutput(saxHandler);
+ // Create our default SAX/DTD handler
+ DefaultSAXOutputHandler saxHandler =
+ new DefaultSAXOutputHandler(System.out, encoding);
+ // Create a translet output handler and plug in the SAX/DTD handler
+ TextOutput textOutput =
+ new TextOutput((ContentHandler)saxHandler,
+ (LexicalHandler)saxHandler, encoding);
+ // Transform and pass output to the translet output handler
translet.transform(dom, textOutput);
if (_debug) {
1.6 +2 -2
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Output.java
Index: Output.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Output.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- Output.java 2001/07/18 15:36:01 1.5
+++ Output.java 2001/08/14 09:16:45 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Output.java,v 1.5 2001/07/18 15:36:01 morten Exp $
+ * @(#)$Id: Output.java,v 1.6 2001/08/14 09:16:45 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -233,7 +233,7 @@
}
// Set system/public doctype only if both are set
- if ((_doctypePublic != null) && (_doctypeSystem != null)) {
+ if (_doctypeSystem != null) {
field = cpg.addFieldref(TRANSLET_CLASS,"_doctypeSystem",STRING_SIG);
il.append(DUP);
il.append(new PUSH(cpg, _doctypeSystem));
1.12 +8 -4
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultRun.java
Index: DefaultRun.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultRun.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- DefaultRun.java 2001/07/20 18:52:09 1.11
+++ DefaultRun.java 2001/08/14 09:16:45 1.12
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: DefaultRun.java,v 1.11 2001/07/20 18:52:09 amiro Exp $
+ * @(#)$Id: DefaultRun.java,v 1.12 2001/08/14 09:16:45 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -77,6 +77,8 @@
import org.xml.sax.XMLReader;
import org.xml.sax.SAXException;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.ext.LexicalHandler;
import org.apache.xalan.xsltc.*;
import org.apache.xalan.xsltc.dom.DOMImpl;
@@ -167,9 +169,11 @@
// Transform the document
String encoding = _translet._encoding;
- DefaultSAXOutputHandler saxHandler = new
- DefaultSAXOutputHandler(System.out, encoding);
- TextOutput textOutput = new TextOutput(saxHandler);
+ DefaultSAXOutputHandler saxHandler =
+ new DefaultSAXOutputHandler(System.out, encoding);
+ TextOutput textOutput =
+ new TextOutput((ContentHandler)saxHandler,
+ (LexicalHandler)saxHandler, encoding);
translet.transform(dom, textOutput);
if (_debug) {
1.13 +41 -18
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultSAXOutputHandler.java
Index: DefaultSAXOutputHandler.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/DefaultSAXOutputHandler.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- DefaultSAXOutputHandler.java 2001/08/13 15:25:56 1.12
+++ DefaultSAXOutputHandler.java 2001/08/14 09:16:45 1.13
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: DefaultSAXOutputHandler.java,v 1.12 2001/08/13 15:25:56 morten
Exp $
+ * @(#)$Id: DefaultSAXOutputHandler.java,v 1.13 2001/08/14 09:16:45 morten
Exp $
*
* The Apache Software License, Version 1.1
*
@@ -74,9 +74,9 @@
import org.xml.sax.Locator;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
-import org.xml.sax.ext.DeclHandler;
+import org.xml.sax.ext.LexicalHandler;
-public class DefaultSAXOutputHandler implements ContentHandler, DeclHandler {
+public class DefaultSAXOutputHandler implements ContentHandler,
LexicalHandler {
// The output writer
private Writer _writer;
@@ -425,22 +425,45 @@
// Do nothing
}
- public void attributeDecl(java.lang.String eName, java.lang.String
aName, java.lang.String type, java.lang.String valueDefault, java.lang.String
value) {
-
- }
-
- public void elementDecl(java.lang.String name, java.lang.String model) {
-
- }
-
- public void externalEntityDecl(java.lang.String name, java.lang.String
publicId, java.lang.String systemId) {
-
- }
-
- public void internalEntityDecl(java.lang.String name, java.lang.String
value) {
-
+ // The above are ignored methods of the org.xml.sax.ext.LexicalHandler
intf.
+ public void startCDATA() { }
+ public void endCDATA() { }
+ public void comment(char[] ch, int start, int length) { }
+ public void startEntity(java.lang.String name) { }
+ public void endDTD() { }
+ public void endEntity(String name) { }
+
+ /**
+ * This method is part of the LexicalHandler interface. It is only used
to
+ * pass DOCTYPE declarations (based on the doctype-system/public
attributes
+ * in the <xsl:output> element) to the output handler.
+ * @param name The document type name (name of first element)
+ * @param publicId <xsl:output doctype-public="..."/>
+ * @param systemId <xsl:output doctype-system="..."/>
+ * @throws SAXException Whenever
+ */
+ public void startDTD(String name, String publicId, String systemId)
+ throws SAXException {
+ try {
+ StringBuffer buf = new StringBuffer("<!DOCTYPE ");
+ buf.append(name);
+ if (publicId == null) {
+ buf.append(" SYSTEM ");
+ }
+ else {
+ buf.append(" PUBLIC \"");
+ buf.append(publicId);
+ buf.append("\" ");
+ }
+ buf.append('\"');
+ buf.append(systemId);
+ buf.append("\">\n");
+ _writer.write(buf.toString());
+ }
+ catch (IOException e) {
+ throw new SAXException(e);
+ }
}
-
/**
* Adds a newline in the output stream and indents to correct level
1.19 +8 -9
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/TextOutput.java
Index: TextOutput.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/TextOutput.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- TextOutput.java 2001/08/13 15:25:56 1.18
+++ TextOutput.java 2001/08/14 09:16:45 1.19
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: TextOutput.java,v 1.18 2001/08/13 15:25:56 morten Exp $
+ * @(#)$Id: TextOutput.java,v 1.19 2001/08/14 09:16:45 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -69,7 +69,7 @@
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
-import org.xml.sax.ext.DeclHandler;
+import org.xml.sax.ext.LexicalHandler;
import org.apache.xalan.xsltc.*;
@@ -136,7 +136,7 @@
// Reference to the SAX2 handler that consumes this handler's output
private ContentHandler _saxHandler;
- private DeclHandler _declHandler;
+ private LexicalHandler _lexHandler;
/**
* Creates a new translet output post-processor
@@ -170,11 +170,10 @@
* @param encoding The default encoding to use (set in <xsl:output>)
* @throws IOException
*/
- public TextOutput(ContentHandler saxHandler, DeclHandler declHandler,
- String encoding)
+ public TextOutput(ContentHandler sax, LexicalHandler lex, String
encoding)
throws IOException {
- _saxHandler = saxHandler;
- _declHandler = declHandler;
+ _saxHandler = sax;
+ _lexHandler = lex;
init();
_encoding = encoding;
}
@@ -479,8 +478,8 @@
}
// Handle document type declaration (for first element only)
- if ((_doctypeSystem != null) && (_declHandler != null)) {
- // _declHandler.something(something);
+ if ((_doctypeSystem != null) && (_lexHandler != null)) {
+ _lexHandler.startDTD(elementName,_doctypePublic,_doctypeSystem);
_doctypeSystem = null;
}
1.13 +21 -10
xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java
Index: TransformerImpl.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- TransformerImpl.java 2001/08/02 13:25:11 1.12
+++ TransformerImpl.java 2001/08/14 09:16:45 1.13
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: TransformerImpl.java,v 1.12 2001/08/02 13:25:11 morten Exp $
+ * @(#)$Id: TransformerImpl.java,v 1.13 2001/08/14 09:16:45 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -70,11 +70,13 @@
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
+import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
+import java.net.UnknownServiceException;
import java.lang.IllegalArgumentException;
import java.util.Enumeration;
@@ -83,6 +85,7 @@
import org.xml.sax.XMLReader;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
+import org.xml.sax.ext.LexicalHandler;
import org.w3c.dom.Document;
@@ -237,7 +240,7 @@
}
}
// If we cannot write to the location specified by the SystemId
- catch (java.net.UnknownServiceException e) {
+ catch (UnknownServiceException e) {
throw new TransformerException(e);
}
// If we cannot create a SAX2DOM adapter
@@ -246,7 +249,7 @@
"SAX2DOM adapter could not be created, " + e.getMessage());
}
// If we cannot create the file specified by the SystemId
- catch (java.io.IOException e) {
+ catch (IOException e) {
throw new TransformerException(e);
}
}
@@ -367,15 +370,24 @@
/**
* Internal transformation method - uses the internal APIs of XSLTC
*/
- private void transform(Source src, ContentHandler handler, String
encoding)
+ private void transform(Source src, ContentHandler sax, String encoding)
throws TransformerException {
try {
// Build an iternal DOMImpl from the TrAX Source
DOMImpl dom = getDOM(src, 0);
+
// Pass output properties to the translet
setOutputProperties(_translet, _properties);
- // Transform the document
- _translet.transform(dom, new TextOutput(handler, _encoding));
+
+ // This handler will post-process the translet output
+ TextOutput handler;
+
+ // Check if the ContentHandler also implements LexicalHandler
+ if (sax instanceof LexicalHandler)
+ handler = new TextOutput(sax, (LexicalHandler)sax, encoding);
+ else
+ handler = new TextOutput(sax, encoding);
+ _translet.transform(dom, handler);
}
catch (TransletException e) {
if (_errorListener != null)
@@ -496,12 +508,11 @@
String value = null;
- // First check if the property is overridden in this Transformer
+ // Level1: Check if the property is overridden in this Transformer
if (_properties != null) value = _properties.getProperty(name);
- // Then check if it is set in the translet
+ // Level2: Check if the property value is set in the translet
if ((value == null) && (_translet != null)) {
- // TODO: get propertie value from translet
if (name.equals(OutputKeys.ENCODING))
value = _translet._encoding;
else if (name.equals(OutputKeys.METHOD))
@@ -524,7 +535,7 @@
value = _translet._version;
}
- // Then return the default values
+ // Level3: Return the default property value
if (value == null) {
if (name.equals(OutputKeys.ENCODING))
value = "utf-8";
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]