Home | History | Annotate | Download | only in templates
      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: AVTPartXPath.java 468643 2006-10-28 06:56:03Z minchau $
     20  */
     21 package org.apache.xalan.templates;
     22 
     23 import org.apache.xml.utils.FastStringBuffer;
     24 import org.apache.xpath.XPath;
     25 import org.apache.xpath.XPathContext;
     26 import org.apache.xpath.XPathFactory;
     27 import org.apache.xpath.compiler.XPathParser;
     28 import org.apache.xpath.objects.XObject;
     29 
     30 /**
     31  * Simple string part of a complex AVT.
     32  * @xsl.usage internal
     33  */
     34 public class AVTPartXPath extends AVTPart
     35 {
     36     static final long serialVersionUID = -4460373807550527675L;
     37 
     38   /**
     39    * The XPath object contained in this part.
     40    * @serial
     41    */
     42   private XPath m_xpath;
     43 
     44   /**
     45    * This function is used to fixup variables from QNames to stack frame
     46    * indexes at stylesheet build time.
     47    * @param vars List of QNames that correspond to variables.  This list
     48    * should be searched backwards for the first qualified name that
     49    * corresponds to the variable reference qname.  The position of the
     50    * QName in the vector from the start of the vector will be its position
     51    * in the stack frame (but variables above the globalsTop value will need
     52    * to be offset to the current stack frame).
     53    */
     54   public void fixupVariables(java.util.Vector vars, int globalsSize)
     55   {
     56     m_xpath.fixupVariables(vars, globalsSize);
     57   }
     58 
     59   /**
     60    * Tell if this expression or it's subexpressions can traverse outside
     61    * the current subtree.
     62    *
     63    * @return true if traversal outside the context node's subtree can occur.
     64    */
     65    public boolean canTraverseOutsideSubtree()
     66    {
     67     return m_xpath.getExpression().canTraverseOutsideSubtree();
     68    }
     69 
     70   /**
     71    * Construct a simple AVT part.
     72    *
     73    * @param xpath Xpath section of AVT
     74    */
     75   public AVTPartXPath(XPath xpath)
     76   {
     77     m_xpath = xpath;
     78   }
     79 
     80   /**
     81    * Construct a simple AVT part.
     82    *
     83    * @param val A pure string section of an AVT.
     84    * @param nsNode An object which can be used to determine the
     85    * Namespace Name (URI) for any Namespace prefix used in the XPath.
     86    * Usually this is based on the context where the XPath was specified,
     87    * such as a node within a Stylesheet.
     88    * @param xpathProcessor XPath parser
     89    * @param factory XPath factory
     90    * @param liaison An XPathContext object, providing infomation specific
     91    * to this invocation and this thread. Maintains SAX output state,
     92    * variables, error handler and so on, so the transformation/XPath
     93    * object itself can be simultaneously invoked from multiple threads.
     94    *
     95    * @throws javax.xml.transform.TransformerException
     96    * TODO: Fix or remove this unused c'tor.
     97    */
     98   public AVTPartXPath(
     99           String val, org.apache.xml.utils.PrefixResolver nsNode,
    100           XPathParser xpathProcessor, XPathFactory factory,
    101           XPathContext liaison)
    102             throws javax.xml.transform.TransformerException
    103   {
    104     m_xpath = new XPath(val, null, nsNode, XPath.SELECT, liaison.getErrorListener());
    105   }
    106 
    107   /**
    108    * Get the AVT part as the original string.
    109    *
    110    * @return the AVT part as the original string.
    111    */
    112   public String getSimpleString()
    113   {
    114     return "{" + m_xpath.getPatternString() + "}";
    115   }
    116 
    117   /**
    118    * Write the value into the buffer.
    119    *
    120    * @param xctxt An XPathContext object, providing infomation specific
    121    * to this invocation and this thread. Maintains SAX state, variables,
    122    * error handler and  so on, so the transformation/XPath object itself
    123    * can be simultaneously invoked from multiple threads.
    124    * @param buf Buffer to write into.
    125    * @param context The current source tree context.
    126    * @param nsNode The current namespace context (stylesheet tree context).
    127    *
    128    * @throws javax.xml.transform.TransformerException
    129    */
    130   public void evaluate(
    131           XPathContext xctxt, FastStringBuffer buf, int context, org.apache.xml.utils.PrefixResolver nsNode)
    132             throws javax.xml.transform.TransformerException
    133   {
    134 
    135     XObject xobj = m_xpath.execute(xctxt, context, nsNode);
    136 
    137     if (null != xobj)
    138     {
    139       xobj.appendToFsb(buf);
    140     }
    141   }
    142 
    143   /**
    144    * @see XSLTVisitable#callVisitors(XSLTVisitor)
    145    */
    146   public void callVisitors(XSLTVisitor visitor)
    147   {
    148   	m_xpath.getExpression().callVisitors(m_xpath, visitor);
    149   }
    150 }
    151