package com.occamlab.te.saxon; import java.util.List; import javax.xml.namespace.QName; import net.sf.saxon.expr.Expression; import net.sf.saxon.expr.ExpressionTool; import net.sf.saxon.expr.StaticContext; import net.sf.saxon.expr.XPathContext; import net.sf.saxon.om.SequenceIterator; import net.sf.saxon.om.StructuredQName; import net.sf.saxon.om.ValueRepresentation; import net.sf.saxon.trans.XPathException; import net.sf.saxon.type.ItemType; import net.sf.saxon.type.SchemaType; import net.sf.saxon.type.TypeHierarchy; import net.sf.saxon.value.SequenceType; import net.sf.saxon.value.Value; public class GetTypeFunctionCall extends TEFunctionCall { List<QName> params = null; boolean usesContext = false; TypeHierarchy th; public GetTypeFunctionCall(StructuredQName functionName, Expression[] staticArgs, StaticContext env) { super(functionName, staticArgs, env); } public static String getTypeName(ItemType it) throws XPathException { if (it instanceof SchemaType) { return "xs:" + ((SchemaType) it).getName(); } return it.toString(); } public SequenceIterator iterate(XPathContext context) throws XPathException { Expression[] argExpressions = getArguments(); ValueRepresentation vr = ExpressionTool.lazyEvaluate(argExpressions[0], context, 1); ItemType it = Value.asValue(vr).getItemType( context.getConfiguration().getTypeHierarchy()); String type = getTypeName(it); Value v = Value.convertJavaObjectToXPath(type, SequenceType.SINGLE_STRING, context); return v.iterate(); } }