/** * Evaluate XPath string to an XObject. XPath namespace prefixes are resolved from the * namespaceNode. The implementation of this is a little slow, since it creates a number of * objects each time it is called. This could be optimized to keep the same objects around, but * then thread-safety issues would arise. * * @param contextNode The node to start searching from. * @param xpathnode * @param str * @param prefixResolver Will be called if the parser encounters namespace prefixes, to resolve * the prefixes to URLs. * @return An XObject, which can be used to obtain a string, number, nodelist, etc, should never * be null. * @see org.apache.xpath.objects.XObject * @see org.apache.xpath.objects.XNull * @see org.apache.xpath.objects.XBoolean * @see org.apache.xpath.objects.XNumber * @see org.apache.xpath.objects.XString * @see org.apache.xpath.objects.XRTreeFrag * @throws TransformerException */ public XObject eval(Node contextNode, Node xpathnode, String str, PrefixResolver prefixResolver) throws TransformerException { // Since we don't have a XML Parser involved here, install some default support // for things like namespaces, etc. // (Changed from: XPathContext xpathSupport = new XPathContext(); // because XPathContext is weak in a number of areas... perhaps // XPathContext should be done away with.) // Create the XPath object. // String str = CachedXPathFuncHereAPI.getStrFromNode(xpathnode); // only check if string points to different object (for performance) if (str != xpathStr) { if (str.indexOf("here()") > 0) { _context.reset(); _dtmManager = _context.getDTMManager(); } try { xpath = createXPath(str, prefixResolver); } catch (TransformerException ex) { // Try to see if it is a problem with the classloader. Throwable th = ex.getCause(); if (th instanceof ClassNotFoundException) { if (th.getMessage().indexOf("FuncHere") > 0) { throw new RuntimeException(I18n.translate("endorsed.jdk1.4.0") /*,*/ + ex); } } throw ex; } xpathStr = str; } // Execute the XPath, and have it return the result if (this._funcHereContext == null) { this._funcHereContext = new FuncHereContext(xpathnode, this._dtmManager); } int ctxtNode = this._funcHereContext.getDTMHandleFromNode(contextNode); return xpath.execute(this._funcHereContext, ctxtNode, prefixResolver); }
/** * Evaluate XPath string to an XObject. XPath namespace prefixes are resolved from the * namespaceNode. The implementation of this is a little slow, since it creates a number of * objects each time it is called. This could be optimized to keep the same objects around, but * then thread-safety issues would arise. * * @param contextNode The node to start searching from. * @param xpathnode * @param str * @param namespaceNode The node from which prefixes in the XPath will be resolved to namespaces. * @return An XObject, which can be used to obtain a string, number, nodelist, etc, should never * be null. * @see org.apache.xpath.objects.XObject * @see org.apache.xpath.objects.XNull * @see org.apache.xpath.objects.XBoolean * @see org.apache.xpath.objects.XNumber * @see org.apache.xpath.objects.XString * @see org.apache.xpath.objects.XRTreeFrag * @throws TransformerException */ public XObject eval(Node contextNode, Node xpathnode, String str, Node namespaceNode) throws TransformerException { // Create the XPath object. // String str = CachedXPathFuncHereAPI.getStrFromNode(xpathnode); // Since we don't have a XML Parser involved here, install some default support // for things like namespaces, etc. // (Changed from: XPathContext xpathSupport = new XPathContext(); // because XPathContext is weak in a number of areas... perhaps // XPathContext should be done away with.) if (this._funcHereContext == null) { this._funcHereContext = new FuncHereContext(xpathnode, this._dtmManager); } // Create an object to resolve namespace prefixes. // XPath namespaces are resolved from the input context node's document element // if it is a root node, or else the current context node (for lack of a better // resolution space, given the simplicity of this sample code). PrefixResolverDefault prefixResolver = new PrefixResolverDefault( (namespaceNode.getNodeType() == Node.DOCUMENT_NODE) ? ((Document) namespaceNode).getDocumentElement() : namespaceNode); // only check if string points to different object (for performance) if (str != xpathStr) { if (str.indexOf("here()") > 0) { _context.reset(); _dtmManager = _context.getDTMManager(); } xpath = createXPath(str, prefixResolver); xpathStr = str; } // Execute the XPath, and have it return the result // return xpath.execute(xpathSupport, contextNode, prefixResolver); int ctxtNode = this._funcHereContext.getDTMHandleFromNode(contextNode); return xpath.execute(this._funcHereContext, ctxtNode, prefixResolver); }