blob: c0a4038e8fa4c24f3142eaa8daa110377ecaaa08 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id$
*/
package org.apache.xalan.templates;
import javax.xml.transform.TransformerException;
import org.apache.xalan.transformer.TransformerImpl;
import org.apache.xpath.VariableStack;
import org.apache.xpath.objects.XObject;
/**
* Implement xsl:param.
* <pre>
* <!ELEMENT xsl:param %template;>
* <!ATTLIST xsl:param
* name %qname; #REQUIRED
* select %expr; #IMPLIED
* >
* </pre>
* @see <a href="http://www.w3.org/TR/xslt#variables">variables in XSLT Specification</a>
* @xsl.usage advanced
*/
public class ElemParam extends ElemVariable
{
static final long serialVersionUID = -1131781475589006431L;
int m_qnameID;
/**
* Constructor ElemParam
*
*/
public ElemParam(){}
/**
* Get an int constant identifying the type of element.
* @see org.apache.xalan.templates.Constants
*
* @return The token ID of the element
*/
public int getXSLToken()
{
return Constants.ELEMNAME_PARAMVARIABLE;
}
/**
* Return the node name.
*
* @return The element's name
*/
public String getNodeName()
{
return Constants.ELEMNAME_PARAMVARIABLE_STRING;
}
/**
* Copy constructor.
*
* @param param Element from an xsl:param
*
* @throws TransformerException
*/
public ElemParam(ElemParam param) throws TransformerException
{
super(param);
}
/**
* This function is called after everything else has been
* recomposed, and allows the template to set remaining
* values that may be based on some other property that
* depends on recomposition.
*/
public void compose(StylesheetRoot sroot) throws TransformerException
{
super.compose(sroot);
m_qnameID = sroot.getComposeState().getQNameID(m_qname);
int parentToken = m_parentNode.getXSLToken();
if (parentToken == Constants.ELEMNAME_TEMPLATE
|| parentToken == Constants.EXSLT_ELEMNAME_FUNCTION)
((ElemTemplate)m_parentNode).m_inArgsSize++;
}
/**
* Execute a variable declaration and push it onto the variable stack.
* @see <a href="http://www.w3.org/TR/xslt#variables">variables in XSLT Specification</a>
*
* @param transformer non-null reference to the the current transform-time state.
*
* @throws TransformerException
*/
public void execute(TransformerImpl transformer) throws TransformerException
{
if (transformer.getDebug())
transformer.getTraceManager().fireTraceEvent(this);
VariableStack vars = transformer.getXPathContext().getVarStack();
if(!vars.isLocalSet(m_index))
{
int sourceNode = transformer.getXPathContext().getCurrentNode();
XObject var = getValue(transformer, sourceNode);
// transformer.getXPathContext().getVarStack().pushVariable(m_qname, var);
transformer.getXPathContext().getVarStack().setLocalVariable(m_index, var);
}
if (transformer.getDebug())
transformer.getTraceManager().fireTraceEndEvent(this);
}
}