1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
package com.jclark.xsl.dom;
import com.jclark.xsl.tr.*;
import com.jclark.xsl.om.*;
import com.jclark.xsl.sax.ExtensionHandlerImpl;
import com.jclark.xsl.sax.MultiNamespaceResult;
import java.net.URL;
import java.io.IOException;
public class XSLTransformEngine implements TransformEngine, XMLProcessor {
private Engine engine;
private DOMExtensions extend;
public Node load(URL url,
int documentIndex,
LoadContext context,
NameTable nameTable) throws XSLException {
throw new XSLException("external documents not supported");
}
public Result createResult(Node baseNode,
int documentIndex,
LoadContext loadContext,
Node[] rootNodeRef) throws XSLException {
if (baseNode == null)
throw new XSLException("cannot convert result tree fragment returned by extension function to a node-set with the DOM");
RootNode root = ((NodeBase)baseNode).root;
org.w3c.dom.DocumentFragment docFrag
= root.ownerDocument.createDocumentFragment();
String base = null;
URL baseURL = baseNode.getURL();
if (baseURL != null)
base = baseURL.toString();
rootNodeRef[0] =
new RootNode(docFrag,
extend,
loadContext,
engine.getNameTable(),
base,
documentIndex);
return new MultiNamespaceResult(new DOMBuilder(docFrag), null);
}
public XSLTransformEngine() {
engine = new EngineImpl(this, new ExtensionHandlerImpl());
}
public XSLTransformEngine(DOMExtensions extend) {
this();
this.extend = extend;
}
private class TransformImpl implements Transform, ParameterSet {
private Sheet sheet;
TransformImpl(Sheet sheet) {
this.sheet = sheet;
}
public void transform(org.w3c.dom.Node sourceRoot,
org.w3c.dom.Node resultRoot)
throws TransformException {
try {
sheet.process(new RootNode(sourceRoot,
extend,
sheet.getSourceLoadContext(),
engine.getNameTable(),
null,
0),
XSLTransformEngine.this,
this, // ParameterSet
new MultiNamespaceResult(new DOMBuilder(resultRoot),
null));
}
catch (XSLException e) {
throw toTransformException(e);
}
}
public Object getParameter(Name name) {
return null;
}
}
public Transform createTransform(org.w3c.dom.Node domNode) throws TransformException {
try {
return new TransformImpl(engine.createSheet(new RootNode(domNode,
extend,
engine.getSheetLoadContext(),
engine.getNameTable(),
null,
0)));
}
catch (XSLException e) {
throw toTransformException(e);
}
catch (IOException e) {
throw new Error("unexpected exception: " + e);
}
}
private TransformException toTransformException(XSLException e) {
org.w3c.dom.Node domNode = null;
Node node = e.getNode();
if (node != null)
domNode = ((NodeBase)node).domNode;
String message = e.getMessage();
if (e == null)
message = e.getException().toString();
return new TransformException(message, domNode);
}
}
|