19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: XPath.java 468655 2006-10-28 07:12:06Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.Serializable;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.ErrorListener;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.SourceLocator;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.PrefixResolver;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SAXSourceLocator;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.Compiler;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.FunctionTable;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.XPathParser;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.functions.Function;
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.res.XPATHErrorResources;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The XPath class wraps an expression object and provides general services
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for execution of that expression.
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class XPath implements Serializable, ExpressionOwner
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = 3976493477939110553L;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The top of the expression tree.
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial */
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Expression m_mainExp;
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The function table for xpath build-in functions
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private transient FunctionTable m_funcTable = null;
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * initial the function table
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void initFunctionTable(){
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	      m_funcTable = new FunctionTable();
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the raw Expression object that this class wraps.
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the raw Expression object, which should not normally be null.
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public Expression getExpression()
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_mainExp;
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function is used to fixup variables from QNames to stack frame
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * indexes at stylesheet build time.
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param vars List of QNames that correspond to variables.  This list
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * should be searched backwards for the first qualified name that
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * corresponds to the variable reference qname.  The position of the
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * QName in the vector from the start of the vector will be its position
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * in the stack frame (but variables above the globalsTop value will need
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * to be offset to the current stack frame).
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void fixupVariables(java.util.Vector vars, int globalsSize)
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_mainExp.fixupVariables(vars, globalsSize);
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the raw expression object for this object.
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param exp the raw Expression object, which should not normally be null.
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setExpression(Expression exp)
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(null != m_mainExp)
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	exp.exprSetParent(m_mainExp.exprGetParent()); // a bit bogus
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_mainExp = exp;
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the SourceLocator on the expression object.
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the SourceLocator on the expression object, which may be null.
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public SourceLocator getLocator()
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_mainExp;
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  /**
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * Set the SourceLocator on the expression object.
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   *
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   * @param l the SourceLocator on the expression object, which may be null.
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//   */
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  public void setLocator(SourceLocator l)
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    // Note potential hazards -- l may not be serializable, or may be changed
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      // after being assigned here.
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    m_mainExp.setSourceLocator(l);
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** The pattern string, mainly kept around for diagnostic purposes.
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  @serial  */
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  String m_patternString;
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the XPath string associated with this object.
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the XPath string associated with this object.
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getPatternString()
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_patternString;
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Represents a select type expression. */
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int SELECT = 0;
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Represents a match type expression.  */
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final int MATCH = 1;
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an XPath object.
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (Needs review -sc) This method initializes an XPathParser/
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compiler and compiles the expression.
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param exprString The XPath expression.
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param locator The location of the expression, may be null.
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefixResolver A prefix resolver to use to resolve prefixes to
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                       namespace URIs.
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type one of {@link #SELECT} or {@link #MATCH}.
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param errorListener The error listener, or null if default should be used.
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException if syntax or other error.
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XPath(
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String exprString, SourceLocator locator, PrefixResolver prefixResolver, int type,
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ErrorListener errorListener)
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    initFunctionTable();
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == errorListener)
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      errorListener = new org.apache.xml.utils.DefaultErrorHandler();
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_patternString = exprString;
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathParser parser = new XPathParser(errorListener, locator);
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Compiler compiler = new Compiler(errorListener, locator, m_funcTable);
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (SELECT == type)
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      parser.initXPath(compiler, exprString, prefixResolver);
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (MATCH == type)
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      parser.initMatchPattern(compiler, exprString, prefixResolver);
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_CANNOT_DEAL_XPATH_TYPE, new Object[]{Integer.toString(type)})); //"Can not deal with XPath type: " + type);
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("----------------");
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Expression expr = compiler.compile(0);
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("expr: "+expr);
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.setExpression(expr);
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if((null != locator) && locator instanceof ExpressionNode)
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	expr.exprSetParent((ExpressionNode)locator);
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an XPath object.
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (Needs review -sc) This method initializes an XPathParser/
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compiler and compiles the expression.
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param exprString The XPath expression.
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param locator The location of the expression, may be null.
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefixResolver A prefix resolver to use to resolve prefixes to
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                       namespace URIs.
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type one of {@link #SELECT} or {@link #MATCH}.
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param errorListener The error listener, or null if default should be used.
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException if syntax or other error.
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XPath(
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String exprString, SourceLocator locator,
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          PrefixResolver prefixResolver, int type,
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          ErrorListener errorListener, FunctionTable aTable)
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_funcTable = aTable;
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null == errorListener)
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      errorListener = new org.apache.xml.utils.DefaultErrorHandler();
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_patternString = exprString;
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathParser parser = new XPathParser(errorListener, locator);
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Compiler compiler = new Compiler(errorListener, locator, m_funcTable);
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (SELECT == type)
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      parser.initXPath(compiler, exprString, prefixResolver);
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (MATCH == type)
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      parser.initMatchPattern(compiler, exprString, prefixResolver);
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(XSLMessages.createXPATHMessage(
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            XPATHErrorResources.ER_CANNOT_DEAL_XPATH_TYPE,
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            new Object[]{Integer.toString(type)}));
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //"Can not deal with XPath type: " + type);
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("----------------");
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    Expression expr = compiler.compile(0);
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // System.out.println("expr: "+expr);
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.setExpression(expr);
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if((null != locator) && locator instanceof ExpressionNode)
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    	expr.exprSetParent((ExpressionNode)locator);
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an XPath object.
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * (Needs review -sc) This method initializes an XPathParser/
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Compiler and compiles the expression.
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param exprString The XPath expression.
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param locator The location of the expression, may be null.
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefixResolver A prefix resolver to use to resolve prefixes to
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                       namespace URIs.
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param type one of {@link #SELECT} or {@link #MATCH}.
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException if syntax or other error.
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XPath(
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String exprString, SourceLocator locator, PrefixResolver prefixResolver, int type)
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this(exprString, locator, prefixResolver, type, null);
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct an XPath object.
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param expr The Expression object.
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException if syntax or other error.
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XPath(Expression expr)
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    this.setExpression(expr);
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    initFunctionTable();
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an expression and a context, evaluate the XPath
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and return the result.
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The execution context.
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contextNode The node that "." expresses.
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespaceContext The context in which namespaces in the
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XPath are supposed to be expanded.
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The result of the XPath or null if callbacks are used.
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException thrown if
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the error condition is severe enough to halt processing.
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage experimental
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, org.w3c.dom.Node contextNode,
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          PrefixResolver namespaceContext)
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return execute(
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          xctxt, xctxt.getDTMHandleFromNode(contextNode),
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          namespaceContext);
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an expression and a context, evaluate the XPath
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and return the result.
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The execution context.
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contextNode The node that "." expresses.
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespaceContext The context in which namespaces in the
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XPath are supposed to be expanded.
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException thrown if the active ProblemListener decides
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the error condition is severe enough to halt processing.
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage experimental
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public XObject execute(
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, int contextNode, PrefixResolver namespaceContext)
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushNamespaceContext(namespaceContext);
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushCurrentNodeAndExpression(contextNode, contextNode);
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XObject xobj = null;
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xobj = m_mainExp.execute(xctxt);
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (TransformerException te)
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      te.setLocator(this.getLocator());
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ErrorListener el = xctxt.getErrorListener();
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null != el) // defensive, should never happen.
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        el.error(te);
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw te;
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (Exception e)
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (e instanceof org.apache.xml.utils.WrappedRuntimeException)
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        e = ((org.apache.xml.utils.WrappedRuntimeException) e).getException();
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // e.printStackTrace();
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String msg = e.getMessage();
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (msg == null || msg.length() == 0) {
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           msg = XSLMessages.createXPATHMessage(
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               XPATHErrorResources.ER_XPATH_ERROR, null);
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      TransformerException te = new TransformerException(msg,
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              getLocator(), e);
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ErrorListener el = xctxt.getErrorListener();
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // te.printStackTrace();
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null != el) // defensive, should never happen.
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        el.fatalError(te);
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw te;
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popNamespaceContext();
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentNodeAndExpression();
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return xobj;
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given an expression and a context, evaluate the XPath
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * and return the result.
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The execution context.
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param contextNode The node that "." expresses.
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param namespaceContext The context in which namespaces in the
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * XPath are supposed to be expanded.
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException thrown if the active ProblemListener decides
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the error condition is severe enough to halt processing.
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage experimental
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public boolean bool(
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, int contextNode, PrefixResolver namespaceContext)
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushNamespaceContext(namespaceContext);
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushCurrentNodeAndExpression(contextNode, contextNode);
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return m_mainExp.bool(xctxt);
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (TransformerException te)
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      te.setLocator(this.getLocator());
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ErrorListener el = xctxt.getErrorListener();
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null != el) // defensive, should never happen.
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        el.error(te);
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw te;
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (Exception e)
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      while (e instanceof org.apache.xml.utils.WrappedRuntimeException)
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        e = ((org.apache.xml.utils.WrappedRuntimeException) e).getException();
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // e.printStackTrace();
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String msg = e.getMessage();
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (msg == null || msg.length() == 0) {
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           msg = XSLMessages.createXPATHMessage(
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               XPATHErrorResources.ER_XPATH_ERROR, null);
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      TransformerException te = new TransformerException(msg,
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              getLocator(), e);
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ErrorListener el = xctxt.getErrorListener();
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // te.printStackTrace();
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null != el) // defensive, should never happen.
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        el.fatalError(te);
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        throw te;
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popNamespaceContext();
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentNodeAndExpression();
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return false;
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /** Set to true to get diagnostic messages about the result of
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *  match pattern testing.  */
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private static final boolean DEBUG_MATCHES = false;
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the match score of the given node.
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt XPath runtime context.
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param context The current source tree context node.
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return score, one of {@link #MATCH_SCORE_NODETEST},
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * {@link #MATCH_SCORE_NONE}, {@link #MATCH_SCORE_OTHER},
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * or {@link #MATCH_SCORE_QNAME}.
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public double getMatchScore(XPathContext xctxt, int context)
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushCurrentNode(context);
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    xctxt.pushCurrentExpressionNode(context);
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      XObject score = m_mainExp.execute(xctxt);
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (DEBUG_MATCHES)
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        DTM dtm = xctxt.getDTM(context);
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.out.println("score: " + score.num() + " for "
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                           + dtm.getNodeName(context) + " for xpath "
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                           + this.getPatternString());
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return score.num();
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    finally
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentNode();
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      xctxt.popCurrentExpressionNode();
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // return XPath.MATCH_SCORE_NONE;
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Warn the user of an problem.
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param sourceNode Not used.
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param msg An error msgkey that corresponds to one of the constants found
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            in {@link org.apache.xpath.res.XPATHErrorResources}, which is
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            a key for a format string.
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param args An array of arguments represented in the format string, which
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *             may be null.
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException if the current ErrorListoner determines to
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                              throw an exception.
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void warn(
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, int sourceNode, String msg, Object[] args)
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String fmsg = XSLMessages.createXPATHWarning(msg, args);
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ErrorListener ehandler = xctxt.getErrorListener();
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != ehandler)
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // TO DO: Need to get stylesheet Locator from here.
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ehandler.warning(new TransformerException(fmsg, (SAXSourceLocator)xctxt.getSAXLocator()));
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell the user of an assertion error, and probably throw an
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception.
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param b  If false, a runtime exception will be thrown.
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param msg The assertion message, which should be informative.
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws RuntimeException if the b argument is false.
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void assertion(boolean b, String msg)
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (!b)
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String fMsg = XSLMessages.createXPATHMessage(
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XPATHErrorResources.ER_INCORRECT_PROGRAMMER_ASSERTION,
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        new Object[]{ msg });
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new RuntimeException(fMsg);
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Tell the user of an error, and probably throw an
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * exception.
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xctxt The XPath runtime context.
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param sourceNode Not used.
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param msg An error msgkey that corresponds to one of the constants found
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            in {@link org.apache.xpath.res.XPATHErrorResources}, which is
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *            a key for a format string.
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param args An array of arguments represented in the format string, which
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *             may be null.
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException if the current ErrorListoner determines to
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                              throw an exception.
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void error(
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          XPathContext xctxt, int sourceNode, String msg, Object[] args)
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws javax.xml.transform.TransformerException
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String fmsg = XSLMessages.createXPATHMessage(msg, args);
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    ErrorListener ehandler = xctxt.getErrorListener();
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != ehandler)
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ehandler.fatalError(new TransformerException(fmsg,
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              (SAXSourceLocator)xctxt.getSAXLocator()));
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      SourceLocator slocator = xctxt.getSAXLocator();
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      System.out.println(fmsg + "; file " + slocator.getSystemId()
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         + "; line " + slocator.getLineNumber() + "; column "
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         + slocator.getColumnNumber());
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This will traverse the heararchy, calling the visitor for
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * each member.  If the called visitor method returns
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * false, the subtree should not be called.
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param owner The owner of the visitor, where that path may be
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *              rewritten if needed.
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param visitor The visitor whose appropriate method will be called.
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	m_mainExp.callVisitors(this, visitor);
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if no match is made.
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final double MATCH_SCORE_NONE = Double.NEGATIVE_INFINITY;
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern has the form
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * of a QName optionally preceded by an @ character.
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final double MATCH_SCORE_QNAME = 0.0;
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern pattern has the form NCName:*.
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final double MATCH_SCORE_NSWILD = -0.25;
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern consists of just a NodeTest.
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final double MATCH_SCORE_NODETEST = -0.5;
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The match score if the pattern consists of something
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * other than just a NodeTest or just a qname.
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @xsl.usage advanced
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public static final double MATCH_SCORE_OTHER = 0.5;
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
644