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