package org.basex.query.expr;
import static org.basex.query.QueryText.*;
import static org.basex.query.util.Err.*;
import static org.basex.util.Token.*;
import org.basex.query.QueryContext;
import org.basex.query.QueryException;
import org.basex.query.item.FAttr;
import org.basex.query.item.QNm;
import org.basex.util.InputInfo;
/**
* Attribute constructor.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class CAttr extends CName {
/** Generated namespace. */
private static final byte[] NS0 = token("ns0:");
/** Computed constructor. */
private final boolean comp;
/**
* Constructor.
* @param ii input info
* @param c computed construction flag
* @param n name
* @param v attribute values
*/
public CAttr(final InputInfo ii, final boolean c, final Expr n,
final Expr... v) {
super(ATTRIBUTE, ii, n, v);
comp = c;
}
@Override
public FAttr item(final QueryContext ctx, final InputInfo ii)
throws QueryException {
QNm nm = qname(ctx, ii);
final byte[] cp = nm.prefix();
if(comp) {
final byte[] cu = nm.uri();
if(eq(cp, XML) ^ eq(cu, XMLURI)) CAXML.thrw(input);
if(eq(cu, XMLNSURI)) CAINV.thrw(input, cu);
if(eq(cp, XMLNS) || cp.length == 0 && eq(nm.string(), XMLNS))
CAINV.thrw(input, nm.string());
// create new standard namespace to cover most frequent cases
if(eq(cp, EMPTY) && !eq(cu, EMPTY))
nm = new QNm(concat(NS0, nm.string()), cu);
}
byte[] val = value(ctx, ii);
if(eq(cp, XML) && eq(nm.local(), ID)) val = norm(val);
return new FAttr(nm, val);
}
}