use of org.apache.xml.utils.QName in project robovm by robovm.
the class Compiler method variable.
/**
* Compile a variable reference.
*
* @param opPos The current position in the m_opMap array.
*
* @return reference to {@link org.apache.xpath.operations.Variable} instance.
*
* @throws TransformerException if a error occurs creating the Expression.
*/
protected Expression variable(int opPos) throws TransformerException {
Variable var = new Variable();
opPos = getFirstChildPos(opPos);
int nsPos = getOp(opPos);
java.lang.String namespace = (OpCodes.EMPTY == nsPos) ? null : (java.lang.String) getTokenQueue().elementAt(nsPos);
java.lang.String localname = (java.lang.String) getTokenQueue().elementAt(getOp(opPos + 1));
QName qname = new QName(namespace, localname);
var.setQName(qname);
return var;
}
use of org.apache.xml.utils.QName in project robovm by robovm.
the class ElemApplyTemplates method transformSelectedNodes.
/**
* Perform a query if needed, and call transformNode for each child.
*
* @param transformer non-null reference to the the current transform-time state.
*
* @throws TransformerException Thrown in a variety of circumstances.
* @xsl.usage advanced
*/
public void transformSelectedNodes(TransformerImpl transformer) throws TransformerException {
final XPathContext xctxt = transformer.getXPathContext();
final int sourceNode = xctxt.getCurrentNode();
DTMIterator sourceNodes = m_selectExpression.asIterator(xctxt, sourceNode);
VariableStack vars = xctxt.getVarStack();
int nParams = getParamElemCount();
int thisframe = vars.getStackFrame();
boolean pushContextNodeListFlag = false;
try {
xctxt.pushCurrentNode(DTM.NULL);
xctxt.pushCurrentExpressionNode(DTM.NULL);
xctxt.pushSAXLocatorNull();
transformer.pushElemTemplateElement(null);
final Vector keys = (m_sortElems == null) ? null : transformer.processSortKeys(this, sourceNode);
// Sort if we need to.
if (null != keys)
sourceNodes = sortNodes(xctxt, keys, sourceNodes);
final SerializationHandler rth = transformer.getSerializationHandler();
// ContentHandler chandler = rth.getContentHandler();
final StylesheetRoot sroot = transformer.getStylesheet();
final TemplateList tl = sroot.getTemplateListComposed();
final boolean quiet = transformer.getQuietConflictWarnings();
// Should be able to get this from the iterator but there must be a bug.
DTM dtm = xctxt.getDTM(sourceNode);
int argsFrame = -1;
if (nParams > 0) {
// This code will create a section on the stack that is all the
// evaluated arguments. These will be copied into the real params
// section of each called template.
argsFrame = vars.link(nParams);
vars.setStackFrame(thisframe);
for (int i = 0; i < nParams; i++) {
ElemWithParam ewp = m_paramElems[i];
XObject obj = ewp.getValue(transformer, sourceNode);
vars.setLocalVariable(i, obj, argsFrame);
}
vars.setStackFrame(argsFrame);
}
xctxt.pushContextNodeList(sourceNodes);
pushContextNodeListFlag = true;
IntStack currentNodes = xctxt.getCurrentNodeStack();
IntStack currentExpressionNodes = xctxt.getCurrentExpressionNodeStack();
// pushParams(transformer, xctxt);
int child;
while (DTM.NULL != (child = sourceNodes.nextNode())) {
currentNodes.setTop(child);
currentExpressionNodes.setTop(child);
if (xctxt.getDTM(child) != dtm) {
dtm = xctxt.getDTM(child);
}
final int exNodeType = dtm.getExpandedTypeID(child);
final int nodeType = dtm.getNodeType(child);
final QName mode = transformer.getMode();
ElemTemplate template = tl.getTemplateFast(xctxt, child, exNodeType, mode, -1, quiet, dtm);
// See http://www.w3.org/TR/xslt#built-in-rule.
if (null == template) {
switch(nodeType) {
case DTM.DOCUMENT_FRAGMENT_NODE:
case DTM.ELEMENT_NODE:
template = sroot.getDefaultRule();
// %OPT% direct faster?
break;
case DTM.ATTRIBUTE_NODE:
case DTM.CDATA_SECTION_NODE:
case DTM.TEXT_NODE:
// if(rth.m_elemIsPending || rth.m_docPending)
// rth.flushPending(true);
transformer.pushPairCurrentMatched(sroot.getDefaultTextRule(), child);
transformer.setCurrentElement(sroot.getDefaultTextRule());
// dtm.dispatchCharactersEvents(child, chandler, false);
dtm.dispatchCharactersEvents(child, rth, false);
transformer.popCurrentMatched();
continue;
case DTM.DOCUMENT_NODE:
template = sroot.getDefaultRootRule();
break;
default:
// No default rules for processing instructions and the like.
continue;
}
} else {
transformer.setCurrentElement(template);
}
transformer.pushPairCurrentMatched(template, child);
// See comment with unlink, below
int currentFrameBottom;
if (template.m_frameSize > 0) {
xctxt.pushRTFContext();
// See comment with unlink, below
currentFrameBottom = vars.getStackFrame();
vars.link(template.m_frameSize);
// xsl:params might not be nulled.
if (/* nParams > 0 && */
template.m_inArgsSize > 0) {
int paramIndex = 0;
for (ElemTemplateElement elem = template.getFirstChildElem(); null != elem; elem = elem.getNextSiblingElem()) {
if (Constants.ELEMNAME_PARAMVARIABLE == elem.getXSLToken()) {
ElemParam ep = (ElemParam) elem;
int i;
for (i = 0; i < nParams; i++) {
ElemWithParam ewp = m_paramElems[i];
if (ewp.m_qnameID == ep.m_qnameID) {
XObject obj = vars.getLocalVariable(i, argsFrame);
vars.setLocalVariable(paramIndex, obj);
break;
}
}
if (i == nParams)
vars.setLocalVariable(paramIndex, null);
} else
break;
paramIndex++;
}
}
} else
currentFrameBottom = 0;
// each of them.
for (ElemTemplateElement t = template.m_firstChild; t != null; t = t.m_nextSibling) {
xctxt.setSAXLocator(t);
try {
transformer.pushElemTemplateElement(t);
t.execute(transformer);
} finally {
transformer.popElemTemplateElement();
}
}
if (template.m_frameSize > 0) {
// See Frank Weiss bug around 03/19/2002 (no Bugzilla report yet).
// While unlink will restore to the proper place, the real position
// may have been changed for xsl:with-param, so that variables
// can be accessed.
// of right now.
// More:
// When we entered this function, the current
// frame buffer (cfb) index in the variable stack may
// have been manually set. If we just call
// unlink(), however, it will restore the cfb to the
// previous link index from the link stack, rather than
// the manually set cfb. So,
// the only safe solution is to restore it back
// to the same position it was on entry, since we're
// really not working in a stack context here. (Bug4218)
vars.unlink(currentFrameBottom);
xctxt.popRTFContext();
}
transformer.popCurrentMatched();
}
// end while (DTM.NULL != (child = sourceNodes.nextNode()))
} catch (SAXException se) {
transformer.getErrorListener().fatalError(new TransformerException(se));
} finally {
// Unlink to the original stack frame
if (nParams > 0)
vars.unlink(thisframe);
xctxt.popSAXLocator();
if (pushContextNodeListFlag)
xctxt.popContextNodeList();
transformer.popElemTemplateElement();
xctxt.popCurrentExpressionNode();
xctxt.popCurrentNode();
sourceNodes.detach();
}
}
use of org.apache.xml.utils.QName in project robovm by robovm.
the class XSLTAttributeDef method processQNAMESRNU.
/**
* Process an attribute string of type T_QNAMES_RESOLVE_NULL into a vector
* of QNames where the specification requires non-prefixed elements to be
* placed in the default namespace. (See section 16 of XSLT 1.0; the
* <em>only</em> time that this will get called is for the
* <code>cdata-section-elements</code> attribute on <code>xsl:output</code>.
*
* @param handler non-null reference to current StylesheetHandler that is constructing the Templates.
* @param uri The Namespace URI, or an empty string.
* @param name The local name (without prefix), or empty string if not namespace processing.
* @param rawName The qualified name (with prefix).
* @param value A whitespace delimited list of qualified names.
*
* @return a Vector of QName objects.
*
* @throws org.xml.sax.SAXException if the one of the qualified name strings
* contains a prefix that can not be resolved, or a qualified name contains
* syntax that is invalid for a qualified name.
*/
final Vector processQNAMESRNU(StylesheetHandler handler, String uri, String name, String rawName, String value) throws org.xml.sax.SAXException {
StringTokenizer tokenizer = new StringTokenizer(value, " \t\n\r\f");
int nQNames = tokenizer.countTokens();
Vector qnames = new Vector(nQNames);
String defaultURI = handler.getNamespaceForPrefix("");
for (int i = 0; i < nQNames; i++) {
String tok = tokenizer.nextToken();
if (tok.indexOf(':') == -1) {
qnames.addElement(new QName(defaultURI, tok));
} else {
qnames.addElement(new QName(tok, handler));
}
}
return qnames;
}
use of org.apache.xml.utils.QName in project robovm by robovm.
the class FuncFormatNumb method execute.
/**
* Execute the function. The function must return
* a valid object.
* @param xctxt The current execution context.
* @return A valid XObject.
*
* @throws javax.xml.transform.TransformerException
*/
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException {
// A bit of an ugly hack to get our context.
ElemTemplateElement templElem = (ElemTemplateElement) xctxt.getNamespaceContext();
StylesheetRoot ss = templElem.getStylesheetRoot();
java.text.DecimalFormat formatter = null;
java.text.DecimalFormatSymbols dfs = null;
double num = getArg0().execute(xctxt).num();
String patternStr = getArg1().execute(xctxt).str();
// TODO: what should be the behavior here??
if (patternStr.indexOf(0x00A4) > 0)
// currency sign not allowed
ss.error(XSLTErrorResources.ER_CURRENCY_SIGN_ILLEGAL);
// decimal-format declared in the stylesheet!(xsl:decimal-format
try {
Expression arg2Expr = getArg2();
if (null != arg2Expr) {
String dfName = arg2Expr.execute(xctxt).str();
QName qname = new QName(dfName, xctxt.getNamespaceContext());
dfs = ss.getDecimalFormatComposed(qname);
if (null == dfs) {
warn(xctxt, XSLTErrorResources.WG_NO_DECIMALFORMAT_DECLARATION, //"not found!!!
new Object[] { dfName });
//formatter = new java.text.DecimalFormat(patternStr);
} else {
//formatter = new java.text.DecimalFormat(patternStr, dfs);
formatter = new java.text.DecimalFormat();
formatter.setDecimalFormatSymbols(dfs);
formatter.applyLocalizedPattern(patternStr);
}
}
//else
if (null == formatter) {
// look for a possible default decimal-format
dfs = ss.getDecimalFormatComposed(new QName(""));
if (dfs != null) {
formatter = new java.text.DecimalFormat();
formatter.setDecimalFormatSymbols(dfs);
formatter.applyLocalizedPattern(patternStr);
} else {
dfs = new java.text.DecimalFormatSymbols(java.util.Locale.US);
dfs.setInfinity(Constants.ATTRVAL_INFINITY);
dfs.setNaN(Constants.ATTRVAL_NAN);
formatter = new java.text.DecimalFormat();
formatter.setDecimalFormatSymbols(dfs);
if (null != patternStr)
formatter.applyLocalizedPattern(patternStr);
}
}
return new XString(formatter.format(num));
} catch (Exception iae) {
templElem.error(XSLTErrorResources.ER_MALFORMED_FORMAT_STRING, new Object[] { patternStr });
return XString.EMPTYSTRING;
//throw new XSLProcessorException(iae);
}
}
use of org.apache.xml.utils.QName in project robovm by robovm.
the class OutputProperties method setQNameProperties.
/**
* Set an output property with a QName list value. The QNames will be turned
* into strings with the namespace in curly brackets.
*
* @param key the key to be placed into the property list.
* @param v non-null list of QNames corresponding to <tt>key</tt>.
* @see javax.xml.transform.OutputKeys
*/
public void setQNameProperties(String key, Vector v) {
int s = v.size();
// Just an initial guess at reasonable tuning parameters
FastStringBuffer fsb = new FastStringBuffer(9, 9);
for (int i = 0; i < s; i++) {
QName qname = (QName) v.elementAt(i);
fsb.append(qname.toNamespacedString());
// Don't append space after last value
if (i < s - 1)
fsb.append(' ');
}
m_properties.put(key, fsb.toString());
}
Aggregations