| 121 | } |
| 122 | |
| 123 | @Override |
| 124 | public FNode item(final QueryContext qc, final InputInfo ii) throws QueryException { |
| 125 | final int s = addNS(qc); |
| 126 | try { |
| 127 | // create and check element name |
| 128 | final QNm nm = qname(true, qc); |
| 129 | final byte[] nmPrefix = nm.prefix(), nmUri = nm.uri(); |
| 130 | if(eq(nmPrefix, XML) ^ eq(nmUri, XML_URI)) throw CEXML.get(info, nmPrefix, nmUri); |
| 131 | if(eq(nmUri, XMLNS_URI)) throw CEINV_X.get(info, nmUri); |
| 132 | if(eq(nmPrefix, XMLNS)) throw CEINV_X.get(info, nmPrefix); |
| 133 | if(!nm.hasURI() && nm.hasPrefix()) throw NOQNNAMENS_X.get(info, nmPrefix); |
| 134 | |
| 135 | // create node |
| 136 | final FBuilder elem = FElem.build(nm); |
| 137 | |
| 138 | // add child and attribute nodes |
| 139 | final Constr constr = new Constr(elem, info, qc).add(exprs); |
| 140 | if(constr.errAtt != null) throw NOATTALL_X.get(info, constr.errAtt); |
| 141 | if(constr.errNS != null) throw NONSALL_X.get(info, constr.errNS); |
| 142 | if(constr.duplAtt != null) throw CATTDUPL_X.get(info, constr.duplAtt); |
| 143 | if(constr.duplNS != null) throw DUPLNSCONS_X.get(info, constr.duplNS); |
| 144 | |
| 145 | // assign namespaces |
| 146 | constr.namespaces(nspaces, nm); |
| 147 | |
| 148 | // return optimized node |
| 149 | return elem.finish(); |
| 150 | } finally { |
| 151 | qc.ns.size(s); |
| 152 | } |
| 153 | } |
| 154 | |
| 155 | @Override |
| 156 | public Expr copy(final CompileContext cc, final IntObjectMap<Var> vm) { |