1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the  "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18/*
19 * $Id: ElemIf.java 468643 2006-10-28 06:56:03Z minchau $
20 */
21package org.apache.xalan.templates;
22
23import javax.xml.transform.TransformerException;
24
25import org.apache.xalan.transformer.TransformerImpl;
26import org.apache.xpath.XPath;
27import org.apache.xpath.XPathContext;
28import org.apache.xpath.objects.XObject;
29
30/**
31 * Implement xsl:if.
32 * <pre>
33 * <!ELEMENT xsl:if %template;>
34 * <!ATTLIST xsl:if
35 *   test %expr; #REQUIRED
36 *   %space-att;
37 * >
38 * </pre>
39 * @see <a href="http://www.w3.org/TR/xslt#section-Conditional-Processing-with-xsl:if">XXX in XSLT Specification</a>
40 * @xsl.usage advanced
41 */
42public class ElemIf extends ElemTemplateElement
43{
44    static final long serialVersionUID = 2158774632427453022L;
45
46  /**
47   * The xsl:if element must have a test attribute, which specifies an expression.
48   * @serial
49   */
50  private XPath m_test = null;
51
52  /**
53   * Set the "test" attribute.
54   * The xsl:if element must have a test attribute, which specifies an expression.
55   *
56   * @param v test attribute to set
57   */
58  public void setTest(XPath v)
59  {
60    m_test = v;
61  }
62
63  /**
64   * Get the "test" attribute.
65   * The xsl:if element must have a test attribute, which specifies an expression.
66   *
67   * @return the "test" attribute for this element.
68   */
69  public XPath getTest()
70  {
71    return m_test;
72  }
73
74  /**
75   * This function is called after everything else has been
76   * recomposed, and allows the template to set remaining
77   * values that may be based on some other property that
78   * depends on recomposition.
79   *
80   * @param sroot The root stylesheet.
81   *
82   * @throws TransformerException
83   */
84  public void compose(StylesheetRoot sroot) throws TransformerException
85  {
86
87    super.compose(sroot);
88
89    java.util.Vector vnames = sroot.getComposeState().getVariableNames();
90
91    if (null != m_test)
92      m_test.fixupVariables(vnames, sroot.getComposeState().getGlobalsSize());
93  }
94
95  /**
96   * Get an int constant identifying the type of element.
97   * @see org.apache.xalan.templates.Constants
98   *
99   * @return The token ID for this element
100   */
101  public int getXSLToken()
102  {
103    return Constants.ELEMNAME_IF;
104  }
105
106  /**
107   * Return the node name.
108   *
109   * @return the element's name
110   */
111  public String getNodeName()
112  {
113    return Constants.ELEMNAME_IF_STRING;
114  }
115
116  /**
117   * Conditionally execute a sub-template.
118   * The expression is evaluated and the resulting object is converted
119   * to a boolean as if by a call to the boolean function. If the result
120   * is true, then the content template is instantiated; otherwise, nothing
121   * is created.
122   *
123   * @param transformer non-null reference to the the current transform-time state.
124   *
125   * @throws TransformerException
126   */
127  public void execute(TransformerImpl transformer) throws TransformerException
128  {
129
130    XPathContext xctxt = transformer.getXPathContext();
131    int sourceNode = xctxt.getCurrentNode();
132
133      if (m_test.bool(xctxt, sourceNode, this)) {
134          transformer.executeChildTemplates(this, true);
135      }
136
137  }
138
139  /**
140   * Call the children visitors.
141   * @param visitor The visitor whose appropriate method will be called.
142   */
143  protected void callChildVisitors(XSLTVisitor visitor, boolean callAttrs)
144  {
145  	if(callAttrs)
146  		m_test.getExpression().callVisitors(m_test, visitor);
147    super.callChildVisitors(visitor, callAttrs);
148  }
149
150}
151