ParameterNode.java [plain text]
package gnu.xml.transform;
import java.util.Collections;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
import gnu.xml.xpath.Expr;
final class ParameterNode
extends TemplateNode
{
final String name;
final Expr select;
final boolean global;
ParameterNode(TemplateNode children, TemplateNode next,
String name, Expr select, boolean global)
{
super(children, next);
this.name = name;
this.select = select;
this.global = global;
}
TemplateNode clone(Stylesheet stylesheet)
{
return new ParameterNode((children == null) ? null :
children.clone(stylesheet),
(next == null) ? null :
next.clone(stylesheet),
name,
select.clone(stylesheet),
global);
}
void doApply(Stylesheet stylesheet, QName mode,
Node context, int pos, int len,
Node parent, Node nextSibling)
throws TransformerException
{
boolean apply = global || !stylesheet.bindings.containsKey(name, global);
if (apply)
{
stylesheet.bindings.push(global);
Object value = getValue(stylesheet, mode, context, pos, len);
if (value != null)
{
stylesheet.bindings.set(name, value, global);
}
}
if (next != null)
{
next.apply(stylesheet, mode,
context, pos, len,
parent, nextSibling);
}
if (apply)
{
stylesheet.bindings.pop(global);
}
}
Object getValue(Stylesheet stylesheet, QName mode,
Node context, int pos, int len)
throws TransformerException
{
if (select != null)
{
return select.evaluate(context, pos, len);
}
else if (children != null)
{
Document doc = (context instanceof Document) ? (Document) context :
context.getOwnerDocument();
DocumentFragment fragment = doc.createDocumentFragment();
children.apply(stylesheet, mode, context, pos, len, fragment, null);
return Collections.singleton(fragment);
}
else
{
return null;
}
}
public String toString()
{
StringBuffer buf = new StringBuffer(getClass().getName());
buf.append('[');
buf.append("name=");
buf.append(name);
if (select != null)
{
buf.append(",select=");
buf.append(select);
}
if (global)
{
buf.append(",global");
}
buf.append(']');
return buf.toString();
}
}