Annotation of embedaddon/libxml2/include/libxml/xpath.h, revision 1.1.1.3
1.1 misho 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 */
1.1.1.3 ! misho 36:
1.1 misho 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,
1.1.1.2 misho 71: XPATH_INVALID_CTXT,
1.1.1.3 ! misho 72: XPATH_STACK_ERROR,
! 73: XPATH_FORBID_VARIABLE_ERROR
1.1 misho 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:
1.1.1.3 ! misho 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
1.1 misho 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 */
1.1.1.2 misho 385:
386: int valueFrame; /* used to limit Pop on the stack */
1.1 misho 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) \
1.1.1.3 ! misho 424: ((((ns) != NULL) && \
1.1 misho 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:
1.1.1.3 ! misho 440: XMLPUBFUN void XMLCALL
1.1 misho 441: xmlXPathFreeObject (xmlXPathObjectPtr obj);
1.1.1.3 ! misho 442: XMLPUBFUN xmlNodeSetPtr XMLCALL
1.1 misho 443: xmlXPathNodeSetCreate (xmlNodePtr val);
1.1.1.3 ! misho 444: XMLPUBFUN void XMLCALL
1.1 misho 445: xmlXPathFreeNodeSetList (xmlXPathObjectPtr obj);
1.1.1.3 ! misho 446: XMLPUBFUN void XMLCALL
1.1 misho 447: xmlXPathFreeNodeSet (xmlNodeSetPtr obj);
1.1.1.3 ! misho 448: XMLPUBFUN xmlXPathObjectPtr XMLCALL
1.1 misho 449: xmlXPathObjectCopy (xmlXPathObjectPtr val);
1.1.1.3 ! misho 450: XMLPUBFUN int XMLCALL
1.1 misho 451: xmlXPathCmpNodes (xmlNodePtr node1,
452: xmlNodePtr node2);
453: /**
454: * Conversion functions to basic types.
455: */
1.1.1.3 ! misho 456: XMLPUBFUN int XMLCALL
1.1 misho 457: xmlXPathCastNumberToBoolean (double val);
1.1.1.3 ! misho 458: XMLPUBFUN int XMLCALL
1.1 misho 459: xmlXPathCastStringToBoolean (const xmlChar * val);
1.1.1.3 ! misho 460: XMLPUBFUN int XMLCALL
1.1 misho 461: xmlXPathCastNodeSetToBoolean(xmlNodeSetPtr ns);
1.1.1.3 ! misho 462: XMLPUBFUN int XMLCALL
1.1 misho 463: xmlXPathCastToBoolean (xmlXPathObjectPtr val);
464:
1.1.1.3 ! misho 465: XMLPUBFUN double XMLCALL
1.1 misho 466: xmlXPathCastBooleanToNumber (int val);
1.1.1.3 ! misho 467: XMLPUBFUN double XMLCALL
1.1 misho 468: xmlXPathCastStringToNumber (const xmlChar * val);
1.1.1.3 ! misho 469: XMLPUBFUN double XMLCALL
1.1 misho 470: xmlXPathCastNodeToNumber (xmlNodePtr node);
1.1.1.3 ! misho 471: XMLPUBFUN double XMLCALL
1.1 misho 472: xmlXPathCastNodeSetToNumber (xmlNodeSetPtr ns);
1.1.1.3 ! misho 473: XMLPUBFUN double XMLCALL
1.1 misho 474: xmlXPathCastToNumber (xmlXPathObjectPtr val);
475:
1.1.1.3 ! misho 476: XMLPUBFUN xmlChar * XMLCALL
1.1 misho 477: xmlXPathCastBooleanToString (int val);
1.1.1.3 ! misho 478: XMLPUBFUN xmlChar * XMLCALL
1.1 misho 479: xmlXPathCastNumberToString (double val);
1.1.1.3 ! misho 480: XMLPUBFUN xmlChar * XMLCALL
1.1 misho 481: xmlXPathCastNodeToString (xmlNodePtr node);
1.1.1.3 ! misho 482: XMLPUBFUN xmlChar * XMLCALL
1.1 misho 483: xmlXPathCastNodeSetToString (xmlNodeSetPtr ns);
1.1.1.3 ! misho 484: XMLPUBFUN xmlChar * XMLCALL
1.1 misho 485: xmlXPathCastToString (xmlXPathObjectPtr val);
486:
1.1.1.3 ! misho 487: XMLPUBFUN xmlXPathObjectPtr XMLCALL
1.1 misho 488: xmlXPathConvertBoolean (xmlXPathObjectPtr val);
1.1.1.3 ! misho 489: XMLPUBFUN xmlXPathObjectPtr XMLCALL
1.1 misho 490: xmlXPathConvertNumber (xmlXPathObjectPtr val);
1.1.1.3 ! misho 491: XMLPUBFUN xmlXPathObjectPtr XMLCALL
1.1 misho 492: xmlXPathConvertString (xmlXPathObjectPtr val);
493:
494: /**
495: * Context handling.
496: */
1.1.1.3 ! misho 497: XMLPUBFUN xmlXPathContextPtr XMLCALL
1.1 misho 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: */
1.1.1.3 ! misho 509: XMLPUBFUN long XMLCALL
1.1 misho 510: xmlXPathOrderDocElems (xmlDocPtr doc);
1.1.1.3 ! misho 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
1.1 misho 519: xmlXPathEval (const xmlChar *str,
520: xmlXPathContextPtr ctx);
1.1.1.3 ! misho 521: XMLPUBFUN xmlXPathObjectPtr XMLCALL
1.1 misho 522: xmlXPathEvalExpression (const xmlChar *str,
523: xmlXPathContextPtr ctxt);
1.1.1.3 ! misho 524: XMLPUBFUN int XMLCALL
1.1 misho 525: xmlXPathEvalPredicate (xmlXPathContextPtr ctxt,
526: xmlXPathObjectPtr res);
527: /**
528: * Separate compilation/evaluation entry points.
529: */
1.1.1.3 ! misho 530: XMLPUBFUN xmlXPathCompExprPtr XMLCALL
1.1 misho 531: xmlXPathCompile (const xmlChar *str);
1.1.1.3 ! misho 532: XMLPUBFUN xmlXPathCompExprPtr XMLCALL
1.1 misho 533: xmlXPathCtxtCompile (xmlXPathContextPtr ctxt,
1.1.1.3 ! misho 534: const xmlChar *str);
! 535: XMLPUBFUN xmlXPathObjectPtr XMLCALL
1.1 misho 536: xmlXPathCompiledEval (xmlXPathCompExprPtr comp,
537: xmlXPathContextPtr ctx);
1.1.1.3 ! misho 538: XMLPUBFUN int XMLCALL
1.1 misho 539: xmlXPathCompiledEvalToBoolean(xmlXPathCompExprPtr comp,
540: xmlXPathContextPtr ctxt);
1.1.1.3 ! misho 541: XMLPUBFUN void XMLCALL
1.1 misho 542: xmlXPathFreeCompExpr (xmlXPathCompExprPtr comp);
543: #endif /* LIBXML_XPATH_ENABLED */
544: #if defined(LIBXML_XPATH_ENABLED) || defined(LIBXML_SCHEMAS_ENABLED)
1.1.1.3 ! misho 545: XMLPUBFUN void XMLCALL
1.1 misho 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__ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>