ElementAvailableFunction.java [plain text]
package gnu.xml.transform;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.TreeSet;
import javax.xml.namespace.NamespaceContext;
import javax.xml.xpath.XPathFunction;
import javax.xml.xpath.XPathFunctionException;
import org.w3c.dom.Node;
import gnu.xml.xpath.Expr;
import gnu.xml.xpath.Function;
class ElementAvailableFunction
extends Expr
implements Function, XPathFunction
{
static final Collection elements;
static
{
TreeSet acc = new TreeSet();
acc.add("stylesheet");
acc.add("template");
acc.add("param");
acc.add("variable");
acc.add("include");
acc.add("import");
acc.add("output");
acc.add("preserve-space");
acc.add("strip-space");
acc.add("key");
acc.add("decimal-format");
acc.add("namespace-alias");
acc.add("attribute-set");
acc.add("apply-templates");
acc.add("call-template");
acc.add("value-of");
acc.add("for-each");
acc.add("if");
acc.add("choose");
acc.add("when");
acc.add("otherwise");
acc.add("element");
acc.add("attribute");
acc.add("text");
acc.add("copy");
acc.add("processing-instruction");
acc.add("comment");
acc.add("number");
acc.add("copy-of");
acc.add("message");
acc.add("sort");
acc.add("with-param");
acc.add("fallback");
acc.add("apply-imports");
elements = Collections.unmodifiableSet(acc);
}
final NamespaceContext nsctx;
List args;
ElementAvailableFunction(NamespaceContext nsctx)
{
this.nsctx = nsctx;
}
public Object evaluate(List args)
throws XPathFunctionException
{
return Collections.EMPTY_SET;
}
public void setArguments(List args)
{
this.args = args;
}
public Object evaluate(Node context, int pos, int len)
{
Expr arg = (Expr) args.get(0);
Object val = arg.evaluate(context, pos, len);
String name = _string(context, val);
String prefix, localName, uri;
int ci = name.indexOf(':');
if (ci == -1)
{
prefix = null;
localName = name;
}
else
{
prefix = name.substring(0, ci);
localName = name.substring(ci + 1);
}
uri = nsctx.getNamespaceURI(prefix);
if (Stylesheet.XSL_NS.equals(uri))
{
return elements.contains(localName) ?
Boolean.TRUE : Boolean.FALSE;
}
return Boolean.FALSE;
}
public Expr clone(Object context)
{
NamespaceContext n = nsctx;
if (context instanceof NamespaceContext)
{
n = (NamespaceContext) context;
}
ElementAvailableFunction f = new ElementAvailableFunction(n);
int len = args.size();
List args2 = new ArrayList(len);
for (int i = 0; i < len; i++)
{
args2.add(((Expr) args.get(i)).clone(context));
}
f.setArguments(args2);
return f;
}
}