You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by "Dave Brosius (JIRA)" <xa...@xml.apache.org> on 2008/02/12 07:06:09 UTC

[jira] Created: (XALANJ-2433) Can't use XPath api in xalan extension functions

Can't use XPath api in xalan extension functions
------------------------------------------------

                 Key: XALANJ-2433
                 URL: https://issues.apache.org/jira/browse/XALANJ-2433
             Project: XalanJ2
          Issue Type: Bug
          Components: Xalan-extensions
    Affects Versions: The Latest Development Code
            Reporter: Dave Brosius


If you use XPathFactory to create a new XPath inside an extension function,  the xpath evaluation fails
because the context node is a DTMNodeProxy, and the wrong XPathContext is referred to, and a NullPtrException occurs.

Exception stack trace is
> AxesWalker.setRoot(int) line: 221 
> WalkingIterator.setRoot(int, Object) line: 157 
> XNodeSet(NodeSequence).setRoot(int, Object) line: 265 
> WalkingIterator(LocPathIterator).execute(XPathContext) line: 212 
> XPath.execute(XPathContext, int, PrefixResolver) line: 337 
> XPath.execute(XPathContext, Node, PrefixResolver) line: 303 
> XPathImpl.eval(String, Object) line: 216 
> XPathImpl.evaluate(String, Object, QName) line: 281 
> ExtensionsWithXPath.exfunc(ExpressionContext) line: 28 


because the dtm is null, HERE

public void setRoot(int root)
  {
    // %OPT% Get this directly from the lpi.
    XPathContext xctxt = wi().getXPathContext();
    m_dtm = xctxt.getDTM(root);
    m_traverser = m_dtm.getAxisTraverser(m_axis);  /* HERE m_dtm is null */
    m_isFresh = true;
    m_foundLast = false;
    m_root = root;
    m_currentNode = root;

    if (DTM.NULL == root)
    {
      throw new RuntimeException(
        XSLMessages.createXPATHMessage(XPATHErrorResources.ER_SETTING_WALKER_ROOT_TO_NULL, null)); //"\n !!!! Error! Setting the root of a walker to null!!!");
    }

    resetProximityPositions();
  }


------------------- sample code -----------------------------
public class ExtensionsWithXPath
{
    public static void main(String[] args) throws Exception {
    	System.setProperty("javax.xml.xpath.XPathFactory:" 
    		    +XPathConstants.DOM_OBJECT_MODEL, 
    		    "org.apache.xpath.jaxp.XPathFactoryImpl"); 
    	
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer(new StreamSource(ExtensionsWithXPath.class.getResourceAsStream("/exxp.xsl")));
        t.transform(new StreamSource(ExtensionsWithXPath.class.getResourceAsStream("/exxp.xml")), new StreamResult(System.out));
    }
    
    public String exfunc(ExpressionContext context) {
        try {
            XPathFactory xpath = XPathFactory.newInstance();
            XPath xp = xpath.newXPath();
            NodeList nodes = (NodeList)xp.evaluate("target/@value", context.getContextNode(), XPathConstants.NODESET);
            StringBuilder sb = new StringBuilder();
            int len = nodes.getLength();
            for (int i = 0; i < len; i++) {
                sb.append(((Attr)nodes.item(i)).getValue());
            }
            
            return sb.toString();
        } catch (Exception e) {
            return e.getMessage();
        }
    }
}
-----------------------xsl-----------------------------------
- <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" xmlns:exxp="xalan://ExtensionsWithXPath" extension-element-prefixes="exxp">
- <xsl:template match="/sample">
  <xsl:value-of select="exxp:exfunc()" /> 
  </xsl:template>
  </xsl:transform>
----------------------xml-----------------------------------
<sample>
	<test>
		<target value="42"/>
	</test>
	<test>
		<target value="43"/>
	</test>
</sample>


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-dev-help@xml.apache.org