You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by Adam Jenkins <ma...@adamjenkins.net> on 2021/02/06 10:49:59 UTC

Extension element return value as variable

Hi Everyone,

I have a custom extension element that returns a value (a spring context that stores a large cache of constants).  I enclosed it in a variable thinking the returned object would be set into the variable for use later however it’s storing an XRTreeFrag (the children themselves) into the VariableStack.

You’ll see what I’m trying to do below.  Does anyone have any idea of a better way to accomplish this?

Cheers
Adam


    <xsl:template match="/">
        <xsl:variable name="test1">
	    <spring:context base="CLASSPATH">
                <spring:resource location="/net/adamjenkins/sxe/spring/spring-config.xml"/>
            </spring:context>
        </xsl:variable>        
        <mockelement:run select="$test1”/>


public class Spring{

    public AbstractApplicationContext context(XSLProcessorContext context, ElemExtensionCall extensionElement){
       //returns the spring context
    }

}

public class MockElement {
	
	public void run(XSLProcessorContext context, ElemExtensionCall extensionElement) throws TransformerException {
	System.out.println("running");
        XPathContext xCtx = context.getTransformer().getXPathContext();    
        String selectExpressionString = null;
        boolean namespacePushed = false;
        boolean expressionPushed = false;
        try{   
            selectExpressionString = extensionElement.getAttribute("select");           
            XPath xpath = new XPath(selectExpressionString, xCtx.getSAXLocator(), extensionElement, XPath.SELECT);
            xCtx.pushNamespaceContext(extensionElement);            
            namespacePushed = true;
            int current = xCtx.getCurrentNode();
            xCtx.pushCurrentNodeAndExpression(current, current);        
            expressionPushed=true;
            Expression expr = xpath.getExpression();
            XObject result = expr.execute(xCtx);

	    //If I set the variable using select=“ “ I get back an XObject with the correct variable for “result"
            //if I set the variable using an extension element as above I get back an XRTreeFrag object
        }catch(Throwable t){
            t.printStackTrace();
        }
        finally
        {            
            if(namespacePushed) xCtx.popNamespaceContext();
            if(expressionPushed) xCtx.popCurrentNodeAndExpression();         
        }   
	}

}