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
|
package com.jclark.xsl.tr;
import com.jclark.xsl.om.*;
import com.jclark.xsl.expr.StringExpr;
class ElementAction implements Action {
private StringExpr nameExpr;
private StringExpr namespaceExpr;
private NamespacePrefixMap nsMap;
private Action content;
ElementAction(StringExpr nameExpr, StringExpr namespaceExpr,
NamespacePrefixMap nsMap, Action content) {
this.nameExpr = nameExpr;
this.namespaceExpr = namespaceExpr;
this.nsMap = nsMap;
this.content = content;
}
public void invoke(ProcessContext context, Node sourceNode, Result result)
throws XSLException {
String qname = nameExpr.eval(sourceNode, context);
NamespacePrefixMap map = nsMap.getNameTable().getEmptyNamespacePrefixMap();
Name name;
if (namespaceExpr != null) {
int i = qname.indexOf(':');
String ns = namespaceExpr.eval(sourceNode, context);
if (ns.length() == 0)
name = nsMap.getNameTable().createName(qname.substring(i + 1));
else {
if (i > 0)
map = map.bind(qname.substring(0, i), ns);
else
map = map.bindDefault(ns);
name = map.expandElementTypeName(qname, null);
}
}
else {
name = nsMap.expandElementTypeName(qname, sourceNode);
String ns = name.getNamespace();
if (ns != null) {
String prefix = name.getPrefix();
if (prefix != null)
map = map.bind(prefix, ns);
else
map = map.bindDefault(ns);
}
}
result.startElement(name, map);
if (content != null)
content.invoke(context, sourceNode, result);
result.endElement(name);
}
}
|