1      * Summary: XML Path Language implementation
2      * Description: API for the XML Path Language implementation
3      *
4      * XML Path Language implementation
5      * XPath is a language for addressing parts of an XML document,
6      * designed to be used by both XSLT and XPointer
7      *     http://www.w3.org/TR/xpath
8      *
9      * Implements
10      * W3C Recommendation 16 November 1999
11      *     http://www.w3.org/TR/1999/REC-xpath-19991116
12      *
13      * Copy: See Copyright for the status of this software.
14      *
15      * Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
16
17      /if not defined(XML_XPATH_H__)
18      /define XML_XPATH_H__
19
20      /include "libxmlrpg/xmlversion"
21      /include "libxmlrpg/xmlTypesC"
22
23      /if defined(LIBXML_XPATH_ENABLED)
24
25      /include "libxmlrpg/xmlerror"
26      /include "libxmlrpg/tree"
27      /include "libxmlrpg/hash"
28      /endif                                                                    LIBXML_XPATH_ENABLED
29
30      /if defined(LIBXML_XPATH_ENABLED)
31
32     d xmlXPathContextPtr...
33     d                 s               *   based(######typedef######)
34
35     d xmlXPathParserContextPtr...
36     d                 s               *   based(######typedef######)
37
38      * The set of XPath error codes.
39
40     d xmlXPathError   s             10i 0 based(######typedef######)           enum
41     d  XPATH_EXPRESSION_OK...
42     d                 c                   0
43     d  XPATH_NUMBER_ERROR...
44     d                 c                   1
45     d  XPATH_UNFINISHED_LITERAL_ERROR...
46     d                 c                   2
47     d  XPATH_START_LITERAL_ERROR...
48     d                 c                   3
49     d  XPATH_VARIABLE_REF_ERROR...
50     d                 c                   4
51     d  XPATH_UNDEF_VARIABLE_ERROR...
52     d                 c                   5
53     d  XPATH_INVALID_PREDICATE_ERROR...
54     d                 c                   6
55     d  XPATH_EXPR_ERROR...
56     d                 c                   7
57     d  XPATH_UNCLOSED_ERROR...
58     d                 c                   8
59     d  XPATH_UNKNOWN_FUNC_ERROR...
60     d                 c                   9
61     d  XPATH_INVALID_OPERAND...
62     d                 c                   10
63     d  XPATH_INVALID_TYPE...
64     d                 c                   11
65     d  XPATH_INVALID_ARITY...
66     d                 c                   12
67     d  XPATH_INVALID_CTXT_SIZE...
68     d                 c                   13
69     d  XPATH_INVALID_CTXT_POSITION...
70     d                 c                   14
71     d  XPATH_MEMORY_ERROR...
72     d                 c                   15
73     d  XPTR_SYNTAX_ERROR...
74     d                 c                   16
75     d  XPTR_RESOURCE_ERROR...
76     d                 c                   17
77     d  XPTR_SUB_RESOURCE_ERROR...
78     d                 c                   18
79     d  XPATH_UNDEF_PREFIX_ERROR...
80     d                 c                   19
81     d  XPATH_ENCODING_ERROR...
82     d                 c                   20
83     d  XPATH_INVALID_CHAR_ERROR...
84     d                 c                   21
85     d  XPATH_INVALID_CTXT...
86     d                 c                   22
87     d  XPATH_STACK_ERROR...
88     d                 c                   23
89     d  XPATH_FORBID_VARIABLE_ERROR...
90     d                 c                   24
91
92      * A node-set (an unordered collection of nodes without duplicates).
93
94     d xmlNodeSetPtr   s               *   based(######typedef######)
95
96     d xmlNodeSet      ds                  based(xmlNodeSetPtr)
97     d                                     align qualified
98     d  nodeNr                       10i 0                                      Set node count
99     d  nodeMax                      10i 0                                      Max # nodes in set
100     d  nodeTab                        *                                        xmlNodePtr *
101
102      * An expression is evaluated to yield an object, which
103      * has one of the following four basic types:
104      *   - node-set
105      *   - boolean
106      *   - number
107      *   - string
108      *
109      * @@ XPointer will add more types !
110
111     d xmlXPathObjectType...
112     d                 s             10i 0 based(######typedef######)           enum
113     d  XPATH_UNDEFINED...
114     d                 c                   0
115     d  XPATH_NODESET  c                   1
116     d  XPATH_BOOLEAN  c                   2
117     d  XPATH_NUMBER   c                   3
118     d  XPATH_STRING   c                   4
119     d  XPATH_POINT    c                   5
120     d  XPATH_RANGE    c                   6
121     d  XPATH_LOCATIONSET...
122     d                 c                   7
123     d  XPATH_USERS    c                   8
124     d  XPATH_XSLT_TREE...                                                      R/O XSLT value tree
125     d                 c                   9
126
127     d xmlXPathObjectPtr...
128     d                 s               *   based(######typedef######)
129
130     d xmlXPathObject  ds                  based(xmlXPathObjectPtr)
131     d                                     align qualified
132     d  type                               like(xmlXPathObjectType)
133     d  nodesetval                         like(xmlNodeSetPtr)
134     d  boolval                      10i 0
135     d  floatval                      8f
136     d  stringval                      *                                        xmlChar *
137     d  user                           *                                        void *
138     d  index                        10i 0
139     d  user2                          *                                        void *
140     d  index2                       10i 0
141
142      * xmlXPathConvertFunc:
143      * @obj:  an XPath object
144      * @type:  the number of the target type
145      *
146      * A conversion function is associated to a type and used to cast
147      * the new type to primitive values.
148      *
149      * Returns -1 in case of error, 0 otherwise
150
151     d xmlXPathConvertFunc...
152     d                 s               *   based(######typedef######)
153     d                                     procptr
154
155      * Extra type: a name and a conversion function.
156
157     d xmlXPathTypePtr...
158     d                 s               *   based(######typedef######)
159
160     d xmlXPathType    ds                  based(xmlXPathTypePtr)
161     d                                     align qualified
162     d  name                           *                                        The type name
163     d  func                               like(xmlXPathConvertFunc)            Conversion function
164
165      * Extra variable: a name and a value.
166
167     d xmlXPathVariablePtr...
168     d                 s               *   based(######typedef######)
169
170     d xmlXPathVariable...
171     d                 ds                  based(xmlXPathVariablePtr)
172     d                                     align qualified
173     d  name                           *                                        The variable name
174     d  value                              like(xmlXPathObjectPtr)              The value
175
176      * xmlXPathEvalFunc:
177      * @ctxt: an XPath parser context
178      * @nargs: the number of arguments passed to the function
179      *
180      * An XPath evaluation function, the parameters are on the XPath
181      *   context stack.
182
183     d xmlXPathEvalFunc...
184     d                 s               *   based(######typedef######)
185     d                                     procptr
186
187      * Extra function: a name and an evaluation function.
188
189     d xmlXPathFuncPtr...
190     d                 s               *   based(######typedef######)
191
192     d xmlXPathFunct   ds                  based(xmlXPathFuncPtr)
193     d                                     align qualified
194     d  name                           *                                        The function name
195     d  func                               like(xmlXPathEvalFunc)               Evaluation function
196
197      * xmlXPathAxisFunc:
198      * @ctxt:  the XPath interpreter context
199      * @cur:  the previous node being explored on that axis
200      *
201      * An axis traversal function. To traverse an axis, the engine calls
202      * the first time with cur == NULL and repeat until the function returns
203      * NULL indicating the end of the axis traversal.
204      *
205      * Returns the next node in that axis or NULL if at the end of the axis.
206
207     d xmlXPathAxisFunc...
208     d                 s               *   based(######typedef######)
209     d                                     procptr
210
211      * Extra axis: a name and an axis function.
212
213     d xmlXPathAxisPtr...
214     d                 s               *   based(######typedef######)
215
216     d xmlXPathAxis    ds                  based(xmlXPathAxisPtr)
217     d                                     align qualified
218     d  name                           *                                        The axis name
219     d  func                               like(xmlXPathAxisFunc)               The search function
220
221      * xmlXPathFunction:
222      * @ctxt:  the XPath interprestation context
223      * @nargs:  the number of arguments
224      *
225      * An XPath function.
226      * The arguments (if any) are popped out from the context stack
227      * and the result is pushed on the stack.
228
229     d xmlXPathFunction...
230     d                 s               *   based(######typedef######)
231     d                                     procptr
232
233      * Function and Variable Lookup.
234
235      * xmlXPathVariableLookupFunc:
236      * @ctxt:  an XPath context
237      * @name:  name of the variable
238      * @ns_uri:  the namespace name hosting this variable
239      *
240      * Prototype for callbacks used to plug variable lookup in the XPath
241      * engine.
242      *
243      * Returns the XPath object value or NULL if not found.
244
245     d xmlXPathVariableLookupFunc...
246     d                 s               *   based(######typedef######)
247     d                                     procptr
248
249      * xmlXPathFuncLookupFunc:
250      * @ctxt:  an XPath context
251      * @name:  name of the function
252      * @ns_uri:  the namespace name hosting this function
253      *
254      * Prototype for callbacks used to plug function lookup in the XPath
255      * engine.
256      *
257      * Returns the XPath function or NULL if not found.
258
259     d xmlXPathFuncLookupFunc...
260     d                 s               *   based(######typedef######)
261     d                                     procptr
262
263      * xmlXPathFlags:
264      * Flags for XPath engine compilation and runtime
265
266      * XML_XPATH_CHECKNS:
267      *
268      * check namespaces at compilation
269
270     d  XML_XPATH_CHECKNS...
271     d                 c                   X'0001'
272
273      * XML_XPATH_NOVAR:
274      *
275      * forbid variables in expression
276
277     d  XML_XPATH_NOVAR...
278     d                 c                   X'0002'
279
280      * xmlXPathContext:
281      *
282      * Expression evaluation occurs with respect to a context.
283      * he context consists of:
284      *    - a node (the context node)
285      *    - a node list (the context node list)
286      *    - a set of variable bindings
287      *    - a function library
288      *    - the set of namespace declarations in scope for the expression
289      * Following the switch to hash tables, this need to be trimmed up at
290      * the next binary incompatible release.
291      * The node may be modified when the context is passed to libxml2
292      * for an XPath evaluation so you may need to initialize it again
293      * before the next call.
294
295     d xmlXPathContext...
296     d                 ds                  based(xmlXPathContextPtr)
297     d                                     align qualified
298     d  doc                                like(xmlDocPtr)                      Current document
299     d  node                               like(xmlNodePtr)                     Current node
300      *
301     d  nb_variables_unused...                                                  Unused (hash table)
302     d                               10i 0
303     d  max_variables_unused...                                                  Unused (hash table)
304     d                               10i 0
305     d  varHash                            like(xmlHashTablePtr)                 Defined variables
306      *
307     d  nb_types                     10i 0                                       # of defined types
308     d  max_types                    10i 0                                       Max number of types
309     d  types                              like(xmlXPathTypePtr)                 Defined types array
310      *
311     d  nb_funcs_unused...                                                      Unused (hash table)
312     d                               10i 0
313     d  max_funcs_unused...                                                      Unused (hash table)
314     d                               10i 0
315     d  funcHash                           like(xmlHashTablePtr)                 Defined functions
316      *
317     d  nb_axis                      10i 0                                       # of defined axis
318     d  max_axis                     10i 0                                       Max number of axis
319     d  axis                               like(xmlXPathAxisPtr)                 Defined axis array
320      *
321      * the namespace nodes of the context node
322      *
323     d  namespaces                     *                                         xmlNsPtr *
324     d  nsNr                         10i 0                                       # scope namespaces
325     d  user                           *   procptr                               Function to free
326      *
327      * extra variables
328      *
329     d  contextSize                  10i 0                                       The context size
330     d  proximityPosition...
331     d                               10i 0
332      *
333      * extra stuff for XPointer
334      *
335     d  xptr                         10i 0                                       XPointer context ?
336     d  here                               like(xmlNodePtr)                      For here()
337     d  origin                             like(xmlNodePtr)                      For origin()
338      *
339      * the set of namespace declarations in scope for the expression
340      *
341     d  nsHash                             like(xmlHashTablePtr)                 Namespace hashtable
342     d  varLookupFunc                      like(xmlXPathVariableLookupFunc)      Var lookup function
343     d  varLookupData                  *                                         void *
344      *
345      * Possibility to link in an extra item
346      *
347     d  extra                          *                                         void *
348      *
349      * The function name and URI when calling a function
350      *
351     d  function                       *                                         const xmlChar *
352     d  functionURI                    *                                         const xmlChar *
353      *
354      * function lookup function and data
355      *
356     d  funcLookupFunc...                                                        Func lookup func
357     d                                     like(xmlXPathVariableLookupFunc)
358     d  funcLookupData...                                                        void *
359     d                                 *
360      *
361      * temporary namespace lists kept for walking the namespace axis
362      *
363     d  tmpNsList                      *                                        xmlNsPtr *
364     d  tmpNsNr                      10i 0                                      # scope namespaces
365      *
366      * error reporting mechanism
367      *
368     d  userData                       *                                        void *
369     d  error                              like(xmlStructuredErrorFunc)         Error callback
370     d  lastError                          likeds(xmlError)                     The last error
371     d  debugNode                          like(xmlNodePtr)                     XSLT source node
372      *
373      * dictionary
374      *
375     d  dict                               like(xmlDictPtr)                     Dictionary if any
376      *
377     d  flags                        10i 0                                      Compilation control
378      *
379      * Cache for reusal of XPath objects
380      *
381     d  cache                          *                                        void *
382
383      * The structure of a compiled expression form is not public.
384
385     d xmlXPathCompExprPtr...
386     d                 s               *   based(######typedef######)
387
388      * xmlXPathParserContext:
389      *
390      * An XPath parser context. It contains pure parsing informations,
391      * an xmlXPathContext, and the stack of objects.
392
393     d xmlXPathParserContext...
394     d                 ds                  based(xmlXPathParserContextPtr)
395     d                                     align qualified
396     d  cur                            *                                        const xmlChar *
397     d  base                           *                                        const xmlChar *
398      *
399     d  error                        10i 0                                      Error code
400      *
401     d  context                            like(xmlXPathContextPtr)             Evaluation context
402     d  value                              like(xmlXPathObjectPtr)              The current value
403     d  valueNr                      10i 0                                      Value stack depth
404     d  valueMax                     10i 0                                      Max stack depth
405     d  valueTab                       *                                        xmlXPathObjectPtr *
406      *
407     d  comp                               like(xmlXPathCompExprPtr)            Precompiled expr.
408     d  xptr                         10i 0                                      XPointer expression?
409     d  ancestor                           like(xmlNodePtr)                     To walk prec. axis
410      *
411     d  valueFrame                   10i 0                                      Limit stack pop
412
413      **************************************************************************
414      *                                                                        *
415      *                             Public API                                 *
416      *                                                                        *
417      **************************************************************************
418
419      * Objects and Nodesets handling
420
421     d xmlXPathNAN     s              8f   import('xmlXPathNAN')
422     d xmlXPathPINF    s              8f   import('xmlXPathPINF')
423     d xmlXPathNINF    s              8f   import('xmlXPathNINF')
424
425     d xmlXPathFreeObject...
426     d                 pr                  extproc('xmlXPathFreeObject')
427     d obj                                 value like(xmlXPathObjectPtr)
428
429     d xmlXPathNodeSetCreate...
430     d                 pr                  extproc('xmlXPathNodeSetCreate')
431     d                                     like(xmlNodeSetPtr)
432     d val                                 value like(xmlNodePtr)
433
434     d xmlXPathFreeNodeSetList...
435     d                 pr                  extproc('xmlXPathFreeNodeSetList')
436     d obj                                 value like(xmlXPathObjectPtr)
437
438     d xmlXPathFreeNodeSet...
439     d                 pr                  extproc('xmlXPathFreeNodeSet')
440     d obj                                 value like(xmlNodeSetPtr)
441
442     d xmlXPathObjectCopy...
443     d                 pr                  extproc('xmlXPathObjectCopy')
444     d                                     like(xmlXPathObjectPtr)
445     d val                                 value like(xmlXPathObjectPtr)
446
447     d xmlXPathCmpNodes...
448     d                 pr            10i 0 extproc('xmlXPathCmpNodes')
449     d node1                               value like(xmlNodePtr)
450     d node2                               value like(xmlNodePtr)
451
452      * Conversion functions to basic types.
453
454     d xmlXPathCastNumberToBoolean...
455     d                 pr            10i 0 extproc(
456     d                                      'xmlXPathCastNumberToBoolean')
457     d val                            8f   value
458
459     d xmlXPathCastStringToBoolean...
460     d                 pr            10i 0 extproc(
461     d                                      'xmlXPathCastStringToBoolean')
462     d val                             *   value options(*string)               const xmlChar *
463
464     d xmlXPathCastNodeSetToBoolean...
465     d                 pr            10i 0 extproc(
466     d                                     'xmlXPathCastNodeSetToBoolean')
467     d ns                                  value like(xmlNodeSetPtr)
468
469     d xmlXPathCastToBoolean...
470     d                 pr            10i 0 extproc('xmlXPathCastToBoolean')
471     d val                                 value like(xmlXPathObjectPtr)
472
473     d xmlXPathCastBooleanToNumber...
474     d                 pr                  extproc(
475     d                                      'xmlXPathCastBooleanToNumber')
476     d                                8f
477     d val                           10i 0 value
478
479     d xmlXPathCastStringToNumber...
480     d                 pr             8f   extproc('xmlXPathCastStringToNumber')
481     d val                             *   value options(*string)               const xmlChar *
482
483     d xmlXPathCastNodeToNumber...
484     d                 pr             8f   extproc('xmlXPathCastNodeToNumber')
485     d node                                value like(xmlNodePtr)
486
487     d xmlXPathCastNodeSetToNumber...
488     d                 pr             8f   extproc(
489     d                                      'xmlXPathCastNodeSetToNumber')
490     d ns                                  value like(xmlNodeSetPtr)
491
492     d xmlXPathCastToNumber...
493     d                 pr             8f   extproc('xmlXPathCastToNumber')
494     d val                                 value like(xmlXPathObjectPtr)
495
496     d xmlXPathCastBooleanToString...
497     d                 pr              *   extproc(                             xmlChar *
498     d                                      'xmlXPathCastBooleanToString')
499     d val                           10i 0 value
500
501     d xmlXPathCastNumberToString...
502     d                 pr              *   extproc('xmlXPathCastNumberToString')xmlChar *
503     d val                            8f   value
504
505     d xmlXPathCastNodeToString...
506     d                 pr              *   extproc('xmlXPathCastNodeToString')  xmlChar *
507     d node                                value like(xmlNodePtr)
508
509     d xmlXPathCastNodeSetToString...
510     d                 pr              *   extproc('xmlXPathCastNodeSetToString'xmlChar *
511     d                                     )
512     d ns                                  value like(xmlNodeSetPtr)
513
514     d xmlXPathCastToString...
515     d                 pr              *   extproc('xmlXPathCastToString')      xmlChar *
516     d val                                 value like(xmlXPathObjectPtr)
517
518     d xmlXPathConvertBoolean...
519     d                 pr                  extproc('xmlXPathConvertBoolean')
520     d                                     like(xmlXPathObjectPtr)
521     d val                                 value like(xmlXPathObjectPtr)
522
523     d xmlXPathConvertNumber...
524     d                 pr                  extproc('xmlXPathConvertNumber')
525     d                                     like(xmlXPathObjectPtr)
526     d val                                 value like(xmlXPathObjectPtr)
527
528     d xmlXPathConvertString...
529     d                 pr                  extproc('xmlXPathConvertString')
530     d                                     like(xmlXPathObjectPtr)
531     d val                                 value like(xmlXPathObjectPtr)
532
533      * Context handling.
534
535     d xmlXPathNewContext...
536     d                 pr                  extproc('xmlXPathNewContext')
537     d                                     like(xmlXPathContextPtr)
538     d doc                                 value like(xmlDocPtr)
539
540     d xmlXPathFreeContext...
541     d                 pr                  extproc('xmlXPathFreeContext')
542     d ctxt                                value like(xmlXPathContextPtr)
543
544     d xmlXPathContextSetCache...
545     d                 pr            10i 0 extproc('xmlXPathContextSetCache')
546     d ctxt                                value like(xmlXPathContextPtr)
547     d active                        10i 0 value
548     d value                         10i 0 value
549     d options                       10i 0 value
550
551      * Evaluation functions.
552
553     d xmlXPathOrderDocElems...
554     d                 pr                  extproc('xmlXPathOrderDocElems')
555     d                                     like(xmlClong)
556     d doc                                 value like(xmlDocPtr)
557
558     d xmlXPathSetContextNode...
559     d                 pr            10i 0 extproc('xmlXPathSetContextNode')
560     d node                                value like(xmlNodePtr)
561     d ctx                                 value like(xmlXPathContextPtr)
562
563     d xmlXPathNodeEval...
564     d                 pr                  extproc('xmlXPathNodeEval')
565     d                                     like(xmlXPathObjectPtr)
566     d node                                value like(xmlNodePtr)
567     d str                             *   value options(*string)               const xmlChar *
568     d ctx                                 value like(xmlXPathContextPtr)
569
570     d xmlXPathEval    pr                  extproc('xmlXPathEval')
571     d                                     like(xmlXPathObjectPtr)
572     d str                             *   value options(*string)               const xmlChar *
573     d ctx                                 value like(xmlXPathContextPtr)
574
575     d xmlXPathEvalExpression...
576     d                 pr                  extproc('xmlXPathEvalExpression')
577     d                                     like(xmlXPathObjectPtr)
578     d str                             *   value options(*string)               const xmlChar *
579     d ctxt                                value like(xmlXPathContextPtr)
580
581     d xmlXPathEvalPredicate...
582     d                 pr            10i 0 extproc('xmlXPathEvalPredicate')
583     d ctxt                                value like(xmlXPathContextPtr)
584     d res                                 value like(xmlXPathObjectPtr)
585
586      * Separate compilation/evaluation entry points.
587
588     d xmlXPathCompile...
589     d                 pr                  extproc('xmlXPathCompile')
590     d                                     like(xmlXPathCompExprPtr)
591     d str                             *   value options(*string)               const xmlChar *
592
593     d xmlXPathCtxtCompile...
594     d                 pr                  extproc('xmlXPathCtxtCompile')
595     d                                     like(xmlXPathCompExprPtr)
596     d ctxt                                value like(xmlXPathContextPtr)
597     d str                             *   value options(*string)               const xmlChar *
598
599     d xmlXPathCompiledEval...
600     d                 pr                  extproc('xmlXPathCompiledEval')
601     d                                     like(xmlXPathObjectPtr)
602     d comp                                value like(xmlXPathCompExprPtr)
603     d ctx                                 value like(xmlXPathContextPtr)
604
605     d xmlXPathCompiledEvalToBoolean...
606     d                 pr            10i 0 extproc(
607     d                                     'xmlXPathCompiledEvalToBoolean')
608     d comp                                value like(xmlXPathCompExprPtr)
609     d ctxt                                value like(xmlXPathContextPtr)
610
611     d xmlXPathFreeCompExpr...
612     d                 pr                  extproc('xmlXPathFreeCompExpr')
613     d comp                                value like(xmlXPathCompExprPtr)
614      /endif                                                                    LIBXML_XPATH_ENABLED
615
616      /undefine XML_TESTVAL
617      /if defined(LIBXML_XPATH_ENABLED)
618      /define XML_TESTVAL
619      /elseif defined(LIBXML_SCHEMAS_ENABLED)
620      /define XML_TESTVAL
621      /endif
622      /if defined(XML_TESTVAL)
623     d xmlXPathInit    pr                  extproc('xmlXPathInit')
624
625     d xmlXPathIsNaN   pr            10i 0 extproc('xmlXPathIsNaN')
626     d val                            8f   value
627
628     d xmlXPathIsInf   pr            10i 0 extproc('xmlXPathIsInf')
629     d val                            8f   value
630
631      /undefine XML_TESTVAL
632      /endif
633
634      * C macros implemented as procedures for ILE/RPG support.
635
636      /if defined(LIBXML_XPATH_ENABLED)
637     d xmlXPathNodeSetGetLength...
638     d                 pr            10i 0 extproc('__xmlXPathNodeSetGetLength')
639     d  ns                                 value like(xmlNodeSetPtr)
640
641     d xmlXPathNodeSetItem...
642     d                 pr                  extproc('__xmlXPathNodeSetItem')
643     d                                     like(xmlNodePtr)
644     d  ns                                 value like(xmlNodeSetPtr)
645     d  index                        10i 0 value
646
647     d xmlXPathNodeSetIsEmpty...
648     d                 pr            10i 0 extproc('__xmlXPathNodeSetIsEmpty')
649     d  ns                                 value like(xmlNodeSetPtr)
650      /endif                                                                    LIBXML_XPATH_ENABLED
651      /endif                                                                    XML_XPATH_H__
652