00001 /* 00002 * Licensed to the Apache Software Foundation (ASF) under one 00003 * or more contributor license agreements. See the NOTICE file 00004 * distributed with this work for additional information 00005 * regarding copyright ownership. The ASF licenses this file 00006 * to you under the Apache License, Version 2.0 (the "License"); 00007 * you may not use this file except in compliance with the License. 00008 * You may obtain a copy of the License at 00009 * 00010 * http://www.apache.org/licenses/LICENSE-2.0 00011 * 00012 * Unless required by applicable law or agreed to in writing, software 00013 * distributed under the License is distributed on an "AS IS" BASIS, 00014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00015 * See the License for the specific language governing permissions and 00016 * limitations under the License. 00017 */ 00018 #if !defined(XPATHPROCESSORIMPL_HEADER_GUARD_1357924680) 00019 #define XPATHPROCESSORIMPL_HEADER_GUARD_1357924680 00020 00021 00022 00023 // Base header file. Must be first. 00024 #include <xalanc/XPath/XPathDefinitions.hpp> 00025 00026 00027 00028 #include <cstdlib> 00029 00030 00031 00032 #include <xalanc/XalanDOM/XalanDOMString.hpp> 00033 00034 00035 00036 #include <xalanc/Include/XalanVector.hpp> 00037 #include <xalanc/Include/XalanMap.hpp> 00038 00039 00040 00041 #include "xalanc/PlatformSupport/XalanMessageLoader.hpp" 00042 00043 00044 00045 // Base class header file... 00046 #include <xalanc/XPath/XPathProcessor.hpp> 00047 00048 00049 00050 #include <xalanc/XPath/XPath.hpp> 00051 00052 00053 00054 XALAN_CPP_NAMESPACE_BEGIN 00055 00056 00057 00058 class XalanNode; 00059 00060 00061 00062 /** 00063 * The XPathProcessorImpl class responsibilities include tokenizing and 00064 * parsing the XPath expression, and acting as a general interface to XPaths. 00065 */ 00066 class XALAN_XPATH_EXPORT XPathProcessorImpl : public XPathProcessor 00067 { 00068 public: 00069 00070 typedef XalanMap<XalanDOMString, 00071 const XalanDOMString*> StringToStringMapType; 00072 00073 typedef XalanVector<bool> BoolVectorType; 00074 00075 typedef XalanDOMString::size_type t_size_type; 00076 00077 XPathProcessorImpl(MemoryManager& theManager XALAN_DEFAULT_MEMMGR); 00078 00079 virtual 00080 ~XPathProcessorImpl(); 00081 00082 00083 static XPathProcessorImpl* 00084 create(MemoryManager& theManager); 00085 // These are inherited from XPathProcessor... 00086 00087 virtual void 00088 initXPath( 00089 XPath& pathObj, 00090 XPathConstructionContext& constructionContext, 00091 const XalanDOMString& expression, 00092 const PrefixResolver& resolver, 00093 const Locator* locator = 0, 00094 bool allowVariableReferences = true, 00095 bool allowKeyFunction = true); 00096 00097 virtual void 00098 initMatchPattern( 00099 XPath& pathObj, 00100 XPathConstructionContext& constructionContext, 00101 const XalanDOMString& expression, 00102 const PrefixResolver& resolver, 00103 const Locator* locator = 0, 00104 bool allowVariableReferences = true, 00105 bool allowKeyFunction = true); 00106 00107 private: 00108 00109 /** 00110 * Walk through the expression and build a token queue, and a map of the 00111 * top-level elements. 00112 * 00113 * @param pat XSLT Expression. 00114 */ 00115 void 00116 tokenize(const XalanDOMString& pat); 00117 00118 void 00119 addToTokenQueue(const XalanDOMString& s) const; 00120 00121 void 00122 replaceTokenWithNamespaceToken() const; 00123 00124 /** 00125 * When a separator token is found, see if there's a element name or the 00126 * like to map. 00127 */ 00128 t_size_type 00129 mapNSTokens( 00130 const XalanDOMString& pat, 00131 t_size_type startSubstring, 00132 t_size_type posOfNSSep, 00133 t_size_type posOfScan); 00134 00135 /** 00136 * Check if m_token==s. If m_token is null, this won't throw 00137 * an exception, instead it just returns false (or true 00138 * if s is also null). 00139 */ 00140 bool 00141 tokenIs(const XalanDOMString& s) const; 00142 00143 /** 00144 * Check if m_token==s. If m_token is null, this won't throw 00145 * an exception, instead it just returns false (or true 00146 * if s is also null). 00147 */ 00148 bool 00149 tokenIs(const XalanDOMChar* s) const; 00150 00151 /** 00152 * Check if m_token==s. If m_token is null, this won't throw 00153 * an exception, instead it just returns false (or true 00154 * if s is also null). 00155 */ 00156 bool 00157 tokenIs(XalanDOMChar c) const; 00158 00159 /** 00160 * Lookahead of the current token in order to 00161 * make a branching decision. 00162 * @param s the string to compare it to. 00163 * @param n number of tokens to lookahead. Must be 00164 * greater than 1. 00165 */ 00166 bool 00167 lookahead( 00168 XalanDOMChar c, 00169 int n) const; 00170 00171 /** 00172 * Lookahead of the current token in order to 00173 * make a branching decision. 00174 * @param s the string to compare it to. 00175 * @param n number of tokens to lookahead. Must be 00176 * greater than 1. 00177 */ 00178 bool 00179 lookahead( 00180 const XalanDOMChar* s, 00181 int n) const; 00182 00183 /** 00184 * Lookahead of the current token in order to 00185 * make a branching decision. 00186 * @param s the string to compare it to. 00187 * @param n number of tokens to lookahead. Must be 00188 * greater than 1. 00189 */ 00190 bool 00191 lookahead( 00192 const XalanDOMString& s, 00193 int n) const; 00194 00195 /** 00196 * Lookbehind the first character of the current token in order to 00197 * make a branching decision. 00198 * @param c the character to compare it to. 00199 * @param n number of tokens to lookbehind. Must be 00200 * greater than 1. Note that the lookbehind terminates 00201 * at either the beginning of the string or on a '|' 00202 * character. Because of this, this method should only 00203 * be used for pattern matching. 00204 */ 00205 bool 00206 lookbehind( 00207 char c, 00208 int n) const; 00209 00210 /** 00211 * look behind the current token in order to 00212 * see if there is a useable token. 00213 * @param n number of tokens to lookahead. Must be 00214 * greater than 1. Note that the lookbehind terminates 00215 * at either the beginning of the string or on a '|' 00216 * character. Because of this, this method should only 00217 * be used for pattern matching. 00218 * @return true if lookbehind has a token, false otherwise. 00219 */ 00220 bool 00221 lookbehindHasToken(int n) const; 00222 00223 /** 00224 * Retrieve the next token from the command and 00225 * store it in m_token string. 00226 */ 00227 bool 00228 nextToken(); 00229 00230 /** 00231 * Retrieve the next token from the command and 00232 * store it in m_token string. 00233 */ 00234 const XalanDOMString& 00235 getTokenRelative(int theOffset) const; 00236 00237 /** 00238 * Retrieve the previous token from the command and 00239 * store it in m_token string. 00240 */ 00241 void 00242 prevToken(); 00243 00244 /** 00245 * Consume an expected token, throwing an exception if it 00246 * isn't there. 00247 */ 00248 void 00249 consumeExpected(XalanDOMChar expected); 00250 00251 bool 00252 isCurrentLiteral() const; 00253 00254 /** 00255 * Determine if the token is an axis 00256 * 00257 * @param theToken The token to test 00258 * @return true if the token is a valid axis, false if not. 00259 */ 00260 static bool 00261 isAxis(const XalanDOMString& theToken); 00262 00263 /** 00264 * Determine if the token could be a node test 00265 * 00266 * @param theToken The token to test 00267 * @return true if the token is a valid node test, false if not. 00268 */ 00269 static bool 00270 isNodeTest(const XalanDOMString& theToken); 00271 00272 /** 00273 * Throw an exception using the provided message text. 00274 */ 00275 void 00276 error(const XalanDOMString& msg) const; 00277 00278 /** 00279 * Throw an exception using the provided message text. 00280 */ 00281 void 00282 error(XalanMessages::Codes theCode) const; 00283 00284 void 00285 error( 00286 XalanMessages::Codes theCode, 00287 const XalanDOMString& theToken) const; 00288 00289 void 00290 error( 00291 XalanMessages::Codes theCode, 00292 const XalanDOMChar* theToken) const; 00293 00294 void 00295 error( 00296 XalanMessages::Codes theCode, 00297 XalanDOMChar theToken1, 00298 const XalanDOMString& theToken2) const; 00299 00300 /** 00301 * Given a string, return the corresponding token. 00302 */ 00303 static XPathExpression::eOpCodes 00304 getFunctionToken(const XalanDOMString& key) 00305 { 00306 return searchTable(s_functionTable, s_functionTableSize, key).m_opCode; 00307 } 00308 00309 /** 00310 * Given a string, return the corresponding token. 00311 */ 00312 static XPathExpression::eOpCodes 00313 getNodeTypeToken(const XalanDOMString& key) 00314 { 00315 return searchTable(s_nodeTypeTable, s_nodeTypeTableSize, key).m_opCode; 00316 } 00317 00318 /** 00319 * Given a string, return the corresponding token. 00320 */ 00321 static XPathExpression::eOpCodes 00322 getAxisToken(const XalanDOMString& key) 00323 { 00324 return searchTable(s_axisTable, s_axisTableSize, key).m_opCode; 00325 } 00326 00327 /** 00328 * 00329 * -------------------------------------------------------------------------------- 00330 Expr ::= OrExpr 00331 * -------------------------------------------------------------------------------- 00332 */ 00333 void 00334 Expr(); 00335 00336 00337 /** 00338 * 00339 * -------------------------------------------------------------------------------- 00340 OrExpr ::= AndExpr 00341 | OrExpr 'or' AndExpr 00342 * -------------------------------------------------------------------------------- 00343 */ 00344 void 00345 OrExpr(); 00346 00347 /** 00348 * 00349 * -------------------------------------------------------------------------------- 00350 AndExpr ::= EqualityExpr 00351 | AndExpr 'and' EqualityExpr 00352 * -------------------------------------------------------------------------------- 00353 */ 00354 void 00355 AndExpr() ; 00356 00357 /** 00358 * XXXX. 00359 * @returns an Object which is either a String, a Number, a Boolean, or a vector 00360 * of nodes. 00361 * -------------------------------------------------------------------------------- 00362 EqualityExpr ::= RelationalExpr 00363 | EqualityExpr '=' RelationalExpr 00364 * -------------------------------------------------------------------------------- 00365 */ 00366 int 00367 EqualityExpr(int opCodePos = -1); 00368 00369 /** 00370 * XXXX. 00371 * @returns an Object which is either a String, a Number, a Boolean, or a vector 00372 * of nodes. 00373 * -------------------------------------------------------------------------------- 00374 RelationalExpr ::= AdditiveExpr 00375 | RelationalExpr '<' AdditiveExpr 00376 | RelationalExpr '>' AdditiveExpr 00377 | RelationalExpr '<=' AdditiveExpr 00378 | RelationalExpr '>=' AdditiveExpr 00379 * -------------------------------------------------------------------------------- 00380 */ 00381 int 00382 RelationalExpr(int opCodePos = -1); 00383 00384 /** 00385 * XXXX. 00386 * @returns an Object which is either a String, a Number, a Boolean, or a vector 00387 * of nodes. 00388 * -------------------------------------------------------------------------------- 00389 AdditiveExpr ::= MultiplicativeExpr 00390 | AdditiveExpr '+' MultiplicativeExpr 00391 | AdditiveExpr '-' MultiplicativeExpr 00392 * -------------------------------------------------------------------------------- 00393 */ 00394 int 00395 AdditiveExpr(int opCodePos = -1); 00396 00397 /** 00398 * XXXX. 00399 * @returns an Object which is either a String, a Number, a Boolean, or a vector 00400 * of nodes. 00401 * -------------------------------------------------------------------------------- 00402 MultiplicativeExpr ::= UnaryExpr 00403 | MultiplicativeExpr MultiplyOperator UnaryExpr 00404 | MultiplicativeExpr 'div' UnaryExpr 00405 | MultiplicativeExpr 'mod' UnaryExpr 00406 | MultiplicativeExpr 'quo' UnaryExpr 00407 * -------------------------------------------------------------------------------- 00408 */ 00409 int 00410 MultiplicativeExpr(int opCodePos = -1); 00411 00412 /** 00413 * XXXX. 00414 * @returns an Object which is either a String, a Number, a Boolean, or a vector 00415 * of nodes. 00416 * -------------------------------------------------------------------------------- 00417 UnaryExpr ::= UnionExpr 00418 | '-' UnaryExpr 00419 * -------------------------------------------------------------------------------- 00420 */ 00421 void 00422 UnaryExpr(); 00423 00424 /** 00425 * The context of the right hand side expressions is the context of the 00426 * left hand side expression. The results of the right hand side expressions 00427 * are node sets. The result of the left hand side UnionExpr is the union 00428 * of the results of the right hand side expressions. 00429 * 00430 * -------------------------------------------------------------------------------- 00431 UnionExpr ::= PathExpr 00432 | UnionExpr '|' PathExpr 00433 * -------------------------------------------------------------------------------- 00434 */ 00435 void 00436 UnionExpr(); 00437 00438 /** 00439 * 00440 * -------------------------------------------------------------------------------- 00441 PathExpr ::= LocationPath 00442 | FilterExpr 00443 | FilterExpr '/' RelativeLocationPath 00444 | FilterExpr '//' RelativeLocationPath 00445 * -------------------------------------------------------------------------------- 00446 * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide 00447 * the error condition is severe enough to halt processing. 00448 */ 00449 void 00450 PathExpr(); 00451 00452 /** 00453 * 00454 * -------------------------------------------------------------------------------- 00455 FilterExpr ::= PrimaryExpr 00456 | FilterExpr Predicate 00457 * -------------------------------------------------------------------------------- 00458 * @exception XSLProcessorException thrown if the active ProblemListener and XMLParserLiaison decide 00459 * the error condition is severe enough to halt processing. 00460 */ 00461 void 00462 FilterExpr(); 00463 00464 /** 00465 * -------------------------------------------------------------------------------- 00466 PrimaryExpr ::= VariableReference 00467 | '(' Expr ')' 00468 | Literal 00469 | Number 00470 | FunctionCall 00471 * -------------------------------------------------------------------------------- 00472 */ 00473 void 00474 PrimaryExpr(); 00475 00476 00477 /** 00478 * -------------------------------------------------------------------------------- 00479 Argument ::= Expr 00480 * -------------------------------------------------------------------------------- 00481 */ 00482 void 00483 Argument(); 00484 00485 /** 00486 * -------------------------------------------------------------------------------- 00487 FunctionCall ::= FunctionName '(' ( Argument ( ',' Argument)*)? ')' 00488 * -------------------------------------------------------------------------------- 00489 */ 00490 void 00491 FunctionCall(); 00492 00493 void 00494 FunctionPosition(); 00495 00496 void 00497 FunctionLast(); 00498 00499 void 00500 FunctionCount(); 00501 00502 void 00503 FunctionNot(); 00504 00505 void 00506 FunctionTrue(); 00507 00508 void 00509 FunctionFalse(); 00510 00511 void 00512 FunctionBoolean(); 00513 00514 void 00515 FunctionName(int opPos); 00516 00517 void 00518 FunctionLocalName(int opPos); 00519 00520 void 00521 FunctionNumber(int opPos); 00522 00523 void 00524 FunctionFloor(); 00525 00526 void 00527 FunctionCeiling(); 00528 00529 void 00530 FunctionRound(); 00531 00532 void 00533 FunctionString(int opPos); 00534 00535 void 00536 FunctionStringLength(int opPos); 00537 00538 void 00539 FunctionSum(); 00540 00541 void 00542 FunctionNamespaceURI(int opPos); 00543 00544 /** 00545 * -------------------------------------------------------------------------------- 00546 LocationPath ::= RelativeLocationPath 00547 | AbsoluteLocationPath 00548 * -------------------------------------------------------------------------------- 00549 */ 00550 void 00551 LocationPath(); 00552 00553 /** 00554 * -------------------------------------------------------------------------------- 00555 RelativeLocationPath ::= Step 00556 | RelativeLocationPath '/' Step 00557 | AbbreviatedRelativeLocationPath 00558 * -------------------------------------------------------------------------------- 00559 */ 00560 void 00561 RelativeLocationPath(); 00562 00563 /** 00564 * -------------------------------------------------------------------------------- 00565 Step ::= Basis Predicate* 00566 | AbbreviatedStep 00567 */ 00568 void 00569 Step(); 00570 00571 /** 00572 * -------------------------------------------------------------------------------- 00573 Basis ::= AxisName '::' NodeTest 00574 | AbbreviatedBasis 00575 */ 00576 void 00577 Basis(); 00578 00579 /** 00580 * -------------------------------------------------------------------------------- 00581 Basis ::= AxisName '::' NodeTest 00582 | AbbreviatedBasis 00583 */ 00584 XPathExpression::eOpCodes 00585 AxisName(); 00586 00587 /** 00588 * -------------------------------------------------------------------------------- 00589 NodeTest ::= WildcardName 00590 | NodeType '(' ')' 00591 | 'processing-instruction' '(' Literal ')' 00592 */ 00593 int 00594 NodeTest(); 00595 00596 /** 00597 * -------------------------------------------------------------------------------- 00598 Predicate ::= '[' PredicateExpr ']' 00599 * -------------------------------------------------------------------------------- 00600 */ 00601 void 00602 Predicate(); 00603 00604 /** 00605 *-------------------------------------------------------------------------------- 00606 PredicateExpr ::= Expr 00607 *-------------------------------------------------------------------------------- 00608 */ 00609 void 00610 PredicateExpr(); 00611 00612 /** 00613 * QName ::= (Prefix ':')? LocalPart 00614 * Prefix ::= NCName 00615 * LocalPart ::= NCName 00616 */ 00617 void 00618 QName(); 00619 00620 /** 00621 * NCName ::= (Letter | '_') (NCNameChar)* 00622 * NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender 00623 */ 00624 void 00625 NCName(); 00626 00627 /** 00628 * The value of the Literal is the sequence of characters inside 00629 * the " or ' characters>. 00630 * -------------------------------------------------------------------------------- 00631 Literal ::= '"' [^"]* '"' 00632 | "'" [^']* "'" 00633 * -------------------------------------------------------------------------------- 00634 */ 00635 void 00636 Literal(); 00637 00638 /** 00639 * -------------------------------------------------------------------------------- 00640 * Number ::= [0-9]+('.'[0-9]+)? | '.'[0-9]+ 00641 * -------------------------------------------------------------------------------- 00642 */ 00643 void 00644 Number(); 00645 00646 /** 00647 * -------------------------------------------------------------------------------- 00648 Pattern ::= LocationPathPattern 00649 | Pattern '|' LocationPathPattern 00650 * -------------------------------------------------------------------------------- 00651 */ 00652 void 00653 Pattern(); 00654 00655 /** 00656 * 00657 * -------------------------------------------------------------------------------- 00658 LocationPathPattern ::= '/' RelativePathPattern? 00659 | IdKeyPattern (('/' | '//') RelativePathPattern)? 00660 | '//'? RelativePathPattern 00661 * -------------------------------------------------------------------------------- 00662 */ 00663 void 00664 LocationPathPattern(); 00665 00666 /** 00667 * -------------------------------------------------------------------------------- 00668 IdKeyPattern ::= 'id' '(' Literal ')' 00669 | 'key' '(' Literal ',' Literal ')' 00670 * (Also handle doc()) 00671 * -------------------------------------------------------------------------------- 00672 */ 00673 void 00674 IdKeyPattern(); 00675 00676 /** 00677 * -------------------------------------------------------------------------------- 00678 RelativePathPattern ::= StepPattern 00679 | RelativePathPattern '/' StepPattern 00680 | RelativePathPattern '//' StepPattern 00681 * -------------------------------------------------------------------------------- 00682 */ 00683 void 00684 RelativePathPattern(); 00685 00686 /** 00687 * -------------------------------------------------------------------------------- 00688 StepPattern ::= AbbreviatedNodeTestStep 00689 * -------------------------------------------------------------------------------- 00690 */ 00691 void 00692 StepPattern(); 00693 00694 /** 00695 * -------------------------------------------------------------------------------- 00696 AbbreviatedNodeTestStep ::= '@'? NodeTest Predicate* 00697 * -------------------------------------------------------------------------------- 00698 */ 00699 void 00700 AbbreviatedNodeTestStep(); 00701 00702 static bool 00703 isValidFunction(const XalanDOMString& key); 00704 00705 private: 00706 00707 int 00708 FunctionCallArguments(); 00709 00710 struct TableEntry 00711 { 00712 const XalanDOMChar* m_string; 00713 00714 XPathExpression::eOpCodes m_opCode; 00715 }; 00716 00717 #if defined(XALAN_STRICT_ANSI_HEADERS) 00718 typedef std::size_t size_type; 00719 #else 00720 typedef size_t size_type; 00721 #endif 00722 00723 static const TableEntry& 00724 searchTable( 00725 const TableEntry theTable[], 00726 size_type theTableSize, 00727 const XalanDOMString& theString); 00728 00729 /** 00730 * The current input token. 00731 */ 00732 XalanDOMString m_token; 00733 00734 /** 00735 * The first char in m_token, the theory being that this 00736 * is an optimization because we won't have to do index 00737 * into the string as often. 00738 */ 00739 XalanDOMChar m_tokenChar; 00740 00741 /** 00742 * A pointer to the current XPath. 00743 */ 00744 XPath* m_xpath; 00745 00746 /** 00747 * A pointer to the current XPathConstructionContext. 00748 */ 00749 XPathConstructionContext* m_constructionContext; 00750 00751 /** 00752 * A pointer to the current XPath's expression. 00753 */ 00754 XPathExpression* m_expression; 00755 00756 /** 00757 * A pointer to the current executionContext. 00758 */ 00759 const PrefixResolver* m_prefixResolver; 00760 00761 bool m_requireLiterals; 00762 00763 bool m_isMatchPattern; 00764 00765 const Locator* m_locator; 00766 00767 BoolVectorType m_positionPredicateStack; 00768 00769 StringToStringMapType m_namespaces; 00770 00771 bool m_allowVariableReferences; 00772 00773 bool m_allowKeyFunction; 00774 00775 // Static stuff here... 00776 static const XalanDOMString s_emptyString; 00777 00778 static const XalanDOMChar s_functionIDString[]; 00779 00780 // This shouldn't really be here, since it's not part of the XPath standard, 00781 // but rather a part ofthe XSLT standard. 00782 static const XalanDOMChar s_functionKeyString[]; 00783 00784 static const XalanDOMChar s_orString[]; 00785 00786 static const XalanDOMChar s_andString[]; 00787 00788 static const XalanDOMChar s_divString[]; 00789 00790 static const XalanDOMChar s_modString[]; 00791 00792 static const XalanDOMChar s_dotString[]; 00793 00794 static const XalanDOMChar s_dotDotString[]; 00795 00796 static const XalanDOMChar s_axisString[]; 00797 00798 static const XalanDOMChar s_attributeString[]; 00799 00800 static const XalanDOMChar s_childString[]; 00801 00802 static const XalanDOMChar s_lastString[]; 00803 00804 static const XalanDOMChar s_positionString[]; 00805 00806 static const XalanDOMChar s_asteriskString[]; 00807 00808 static const XalanDOMChar s_commentString[]; 00809 00810 static const XalanDOMChar s_piString[]; 00811 00812 static const XalanDOMChar s_nodeString[]; 00813 00814 static const XalanDOMChar s_textString[]; 00815 00816 static const XalanDOMChar s_ancestorString[]; 00817 00818 static const XalanDOMChar s_ancestorOrSelfString[]; 00819 00820 static const XalanDOMChar s_descendantString[]; 00821 00822 static const XalanDOMChar s_descendantOrSelfString[]; 00823 00824 static const XalanDOMChar s_followingString[]; 00825 00826 static const XalanDOMChar s_followingSiblingString[]; 00827 00828 static const XalanDOMChar s_parentString[]; 00829 00830 static const XalanDOMChar s_precedingString[]; 00831 00832 static const XalanDOMChar s_precedingSiblingString[]; 00833 00834 static const XalanDOMChar s_selfString[]; 00835 00836 static const XalanDOMChar s_namespaceString[]; 00837 00838 static const TableEntry s_functionTable[]; 00839 00840 static const size_type s_functionTableSize; 00841 00842 static const TableEntry s_nodeTypeTable[]; 00843 00844 static const size_type s_nodeTypeTableSize; 00845 00846 static const TableEntry s_axisTable[]; 00847 00848 static const size_type s_axisTableSize; 00849 00850 static const TableEntry s_dummyEntry; 00851 }; 00852 00853 00854 00855 XALAN_CPP_NAMESPACE_END 00856 00857 00858 00859 #endif // XPATHPROCESSORIMPL_HEADER_GUARD_1357924680
Doxygen and GraphViz are used to generate this API documentation from the Xalan-C header files.
Xalan-C++ XSLT Processor Version 1.11 |
|