You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by dl...@locus.apache.org on 2000/09/11 22:59:01 UTC
cvs commit: xml-stylebook/src/org/apache/stylebook/processors Xalan2Processor.java
dleslie 00/09/11 13:58:59
Added: src/org/apache/stylebook/processors Xalan2Processor.java
Log:
Added targets (compile2 and package2) for building a version
of Stylebook that works with Xalan-J2.
IMPORTANT: must exclude org.apache.stylebook.processors.XalanProcessor
when building new version. Must exclude Xalan2Processor in same
package when building old version (that uses Xalan-J 1).
Revision Changes Path
1.1 xml-stylebook/src/org/apache/stylebook/processors/Xalan2Processor.java
Index: Xalan2Processor.java
===================================================================
/*****************************************************************************
* Copyright (C) 2000 The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of wich has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
package org.apache.stylebook.processors;
import org.apache.stylebook.*;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.Reader;
import java.net.URL;
import java.util.Enumeration;
import java.util.StringTokenizer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
// Imported TraX classes
import trax.Templates;
import trax.Transformer;
import trax.Result;
import trax.ProcessorException;
import trax.ProcessorFactoryException;
import trax.TransformException;
// Imported JAVA API for XML Parsing 1.0 classes
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
/*
* Build Stylebook with Xalan2Processor rather than XalanProcessor, and you can
* use Stylebook to process documents with Xalan-J 2.
*
* @author (of revision to XalanProcessor) Donald Leslie (donald_leslie@lotus.com)
*/
public class Xalan2Processor extends AbstractComponent implements Processor {
public Document process(Document doc, CreationContext c, Parameters p)
throws CreationException, IOException {
try {
// Retrieve the style
String styf=p.getParameter("stylesheet");
if (null==styf) styf=this.getStyleSheet(doc);
if (null==styf) return(doc);
// Create processor, templates (StylesheetRoot) and transformer.
trax.Processor processor = trax.Processor.newInstance("xslt");
Templates templates = processor.process(new InputSource(styf));
Transformer transformer = templates.newTransformer();
// Set stylesheet parameters
Enumeration enum=p.getParameterNames();
while (enum.hasMoreElements()) {
String name=(String)enum.nextElement();
transformer.setParameter(name, null, p.getParameter(name));
}
// Set up DOM container for result.
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dfactory.newDocumentBuilder();
Document res = docBuilder.newDocument();
// Perform the transformation.
log("Applying XSL sheet \""+styf+"\"");
transformer.transformNode(doc, new Result(res));
return(res);
} catch (Exception e) {
e.printStackTrace(System.out);
throw new CreationException(e.getMessage(),e,doc);
}
}
/** Search for the <?xml:stylesheet ... ?> processing instruction. */
private String getStyleSheet(Document sourceTree) {
String uri=null;
NodeList children=sourceTree.getChildNodes();
int nNodes=children.getLength();
for(int i=0; i<nNodes; i++) {
Node child=children.item(i);
if (Node.PROCESSING_INSTRUCTION_NODE==child.getNodeType()) {
ProcessingInstruction pi=(ProcessingInstruction)child;
if(pi.getNodeName().equals("xml-stylesheet")) {
boolean isOK=true;
StringTokenizer tok=new StringTokenizer(pi.getNodeValue(),
" \t=");
while(tok.hasMoreTokens()) {
if(tok.nextToken().equals("type")) {
String typeVal=tok.nextToken();
typeVal=typeVal.substring(1, typeVal.length()-1);
if(!typeVal.equals("text/xsl")) isOK=false;
}
}
if(isOK) {
tok=new StringTokenizer(pi.getNodeValue()," \t=");
while(tok.hasMoreTokens()) {
if(tok.nextToken().equals("href")) {
uri=tok.nextToken();
uri=uri.substring(1,uri.length()-1);
}
}
break;
}
}
}
}
return(uri);
}
}