/** * Get the value of a node as a string. * * @param n Node to be converted to a string. May be null. * @return value of n as a string, or an empty string if n is null. */ public String toString(org.w3c.dom.Node n) { // %REVIEW% You can't get much uglier than this... int nodeHandle = getDTMHandleFromNode(n); DTM dtm = getDTM(nodeHandle); XMLString strVal = dtm.getStringValue(nodeHandle); return strVal.toString(); }
/** * Get the value of a node as a number. * * @param n Node to be converted to a number. May be null. * @return value of n as a number. */ public double toNumber(org.w3c.dom.Node n) { // %REVIEW% You can't get much uglier than this... int nodeHandle = getDTMHandleFromNode(n); DTM dtm = getDTM(nodeHandle); XString xobj = (XString) dtm.getStringValue(nodeHandle); return xobj.num(); }
/** * Execute the first argument expression that is expected to return a string. If the argument is * null, then get the string value from the current context node. * * @param xctxt Runtime XPath context. * @return The string value of the first argument, or the string value of the current context node * if the first argument is null. * @throws javax.xml.transform.TransformerException if an error occurs while executing the * argument expression. */ protected XMLString getArg0AsString(XPathContext xctxt) throws javax.xml.transform.TransformerException { if (null == m_arg0) { int currentNode = xctxt.getCurrentNode(); if (DTM.NULL == currentNode) return XString.EMPTYSTRING; else { DTM dtm = xctxt.getDTM(currentNode); return dtm.getStringValue(currentNode); } } else return m_arg0.execute(xctxt).xstr(); }
/** * Execute the first argument expression that is expected to return a number. If the argument is * null, then get the number value from the current context node. * * @param xctxt Runtime XPath context. * @return The number value of the first argument, or the number value of the current context node * if the first argument is null. * @throws javax.xml.transform.TransformerException if an error occurs while executing the * argument expression. */ protected double getArg0AsNumber(XPathContext xctxt) throws javax.xml.transform.TransformerException { if (null == m_arg0) { int currentNode = xctxt.getCurrentNode(); if (DTM.NULL == currentNode) return 0; else { DTM dtm = xctxt.getDTM(currentNode); XMLString str = dtm.getStringValue(currentNode); return str.toDouble(); } } else return m_arg0.execute(xctxt).num(); }
/** * 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 { // TransformerImpl transformer = (TransformerImpl)xctxt; TransformerImpl transformer = (TransformerImpl) xctxt.getOwnerObject(); XNodeSet nodes = null; int context = xctxt.getCurrentNode(); DTM dtm = xctxt.getDTM(context); int docContext = dtm.getDocumentRoot(context); if (DTM.NULL == docContext) { // path.error(context, XPATHErrorResources.ER_CONTEXT_HAS_NO_OWNERDOC); //"context does not // have an owner document!"); } String xkeyname = getArg0().execute(xctxt).str(); QName keyname = new QName(xkeyname, xctxt.getNamespaceContext()); XObject arg = getArg1().execute(xctxt); boolean argIsNodeSetDTM = (XObject.CLASS_NODESET == arg.getType()); KeyManager kmgr = transformer.getKeyManager(); // Don't bother with nodeset logic if the thing is only one node. if (argIsNodeSetDTM) { XNodeSet ns = (XNodeSet) arg; ns.setShouldCacheNodes(true); int len = ns.getLength(); if (len <= 1) argIsNodeSetDTM = false; } if (argIsNodeSetDTM) { Hashtable usedrefs = null; DTMIterator ni = arg.iter(); int pos; UnionPathIterator upi = new UnionPathIterator(); upi.exprSetParent(this); while (DTM.NULL != (pos = ni.nextNode())) { dtm = xctxt.getDTM(pos); XMLString ref = dtm.getStringValue(pos); if (null == ref) continue; if (null == usedrefs) usedrefs = new Hashtable(); if (usedrefs.get(ref) != null) { continue; // We already have 'em. } else { // ISTRUE being used as a dummy value. usedrefs.put(ref, ISTRUE); } XNodeSet nl = kmgr.getNodeSetDTMByKey(xctxt, docContext, keyname, ref, xctxt.getNamespaceContext()); nl.setRoot(xctxt.getCurrentNode(), xctxt); // try // { upi.addIterator(nl); // } // catch(CloneNotSupportedException cnse) // { // // will never happen. // } // mnodeset.addNodesInDocOrder(nl, xctxt); needed?? } int current = xctxt.getCurrentNode(); upi.setRoot(current, xctxt); nodes = new XNodeSet(upi); } else { XMLString ref = arg.xstr(); nodes = kmgr.getNodeSetDTMByKey(xctxt, docContext, keyname, ref, xctxt.getNamespaceContext()); nodes.setRoot(xctxt.getCurrentNode(), xctxt); } return nodes; }