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