1 | /* |
2 | * Summary: internal data structures, constants and functions |
3 | * Description: Internal data structures, constants and functions used |
4 | * by the XSLT engine. |
5 | * They are not part of the API or ABI, i.e. they can change |
6 | * without prior notice, use carefully. |
7 | * |
8 | * Copy: See Copyright for the status of this software. |
9 | * |
10 | * Author: Daniel Veillard |
11 | */ |
12 | |
13 | #ifndef __XML_XSLT_INTERNALS_H__ |
14 | #define __XML_XSLT_INTERNALS_H__ |
15 | |
16 | #include <libxml/tree.h> |
17 | #include <libxml/hash.h> |
18 | #include <libxml/xpath.h> |
19 | #include <libxml/xmlerror.h> |
20 | #include <libxml/dict.h> |
21 | #include <libxml/xmlstring.h> |
22 | #include <libxslt/xslt.h> |
23 | #include "xsltexports.h" |
24 | #include "xsltlocale.h" |
25 | #include "numbersInternals.h" |
26 | |
27 | #ifdef __cplusplus |
28 | extern "C" { |
29 | #endif |
30 | |
31 | /* #define XSLT_DEBUG_PROFILE_CACHE */ |
32 | |
33 | /** |
34 | * XSLT_IS_TEXT_NODE: |
35 | * |
36 | * check if the argument is a text node |
37 | */ |
38 | #define XSLT_IS_TEXT_NODE(n) ((n != NULL) && \ |
39 | (((n)->type == XML_TEXT_NODE) || \ |
40 | ((n)->type == XML_CDATA_SECTION_NODE))) |
41 | |
42 | |
43 | /** |
44 | * XSLT_MARK_RES_TREE_FRAG: |
45 | * |
46 | * internal macro to set up tree fragments |
47 | */ |
48 | #define XSLT_MARK_RES_TREE_FRAG(n) \ |
49 | (n)->name = (char *) xmlStrdup(BAD_CAST " fake node libxslt"); |
50 | |
51 | /** |
52 | * XSLT_IS_RES_TREE_FRAG: |
53 | * |
54 | * internal macro to test tree fragments |
55 | */ |
56 | #define XSLT_IS_RES_TREE_FRAG(n) \ |
57 | ((n != NULL) && ((n)->type == XML_DOCUMENT_NODE) && \ |
58 | ((n)->name != NULL) && ((n)->name[0] == ' ')) |
59 | |
60 | /** |
61 | * XSLT_REFACTORED_KEYCOMP: |
62 | * |
63 | * Internal define to enable on-demand xsl:key computation. |
64 | * That's the only mode now but the define is kept for compatibility |
65 | */ |
66 | #define XSLT_REFACTORED_KEYCOMP |
67 | |
68 | /** |
69 | * XSLT_FAST_IF: |
70 | * |
71 | * Internal define to enable usage of xmlXPathCompiledEvalToBoolean() |
72 | * for XSLT "tests"; e.g. in <xsl:if test="/foo/bar"> |
73 | */ |
74 | #define XSLT_FAST_IF |
75 | |
76 | /** |
77 | * XSLT_REFACTORED: |
78 | * |
79 | * Internal define to enable the refactored parts of Libxslt. |
80 | */ |
81 | /* #define XSLT_REFACTORED */ |
82 | /* ==================================================================== */ |
83 | |
84 | /** |
85 | * XSLT_REFACTORED_VARS: |
86 | * |
87 | * Internal define to enable the refactored variable part of libxslt |
88 | */ |
89 | #define XSLT_REFACTORED_VARS |
90 | |
91 | #ifdef XSLT_REFACTORED |
92 | |
93 | extern const xmlChar *xsltXSLTAttrMarker; |
94 | |
95 | |
96 | /* TODO: REMOVE: #define XSLT_REFACTORED_EXCLRESNS */ |
97 | |
98 | /* TODO: REMOVE: #define XSLT_REFACTORED_NSALIAS */ |
99 | |
100 | /** |
101 | * XSLT_REFACTORED_XSLT_NSCOMP |
102 | * |
103 | * Internal define to enable the pointer-comparison of |
104 | * namespaces of XSLT elements. |
105 | */ |
106 | /* #define XSLT_REFACTORED_XSLT_NSCOMP */ |
107 | |
108 | #ifdef XSLT_REFACTORED_XSLT_NSCOMP |
109 | |
110 | extern const xmlChar *xsltConstNamespaceNameXSLT; |
111 | |
112 | /** |
113 | * IS_XSLT_ELEM_FAST: |
114 | * |
115 | * quick test to detect XSLT elements |
116 | */ |
117 | #define IS_XSLT_ELEM_FAST(n) \ |
118 | (((n) != NULL) && ((n)->ns != NULL) && \ |
119 | ((n)->ns->href == xsltConstNamespaceNameXSLT)) |
120 | |
121 | /** |
122 | * IS_XSLT_ATTR_FAST: |
123 | * |
124 | * quick test to detect XSLT attributes |
125 | */ |
126 | #define IS_XSLT_ATTR_FAST(a) \ |
127 | (((a) != NULL) && ((a)->ns != NULL) && \ |
128 | ((a)->ns->href == xsltConstNamespaceNameXSLT)) |
129 | |
130 | /** |
131 | * XSLT_HAS_INTERNAL_NSMAP: |
132 | * |
133 | * check for namespace mapping |
134 | */ |
135 | #define XSLT_HAS_INTERNAL_NSMAP(s) \ |
136 | (((s) != NULL) && ((s)->principal) && \ |
137 | ((s)->principal->principalData) && \ |
138 | ((s)->principal->principalData->nsMap)) |
139 | |
140 | /** |
141 | * XSLT_GET_INTERNAL_NSMAP: |
142 | * |
143 | * get pointer to namespace map |
144 | */ |
145 | #define XSLT_GET_INTERNAL_NSMAP(s) ((s)->principal->principalData->nsMap) |
146 | |
147 | #else /* XSLT_REFACTORED_XSLT_NSCOMP */ |
148 | |
149 | /** |
150 | * IS_XSLT_ELEM_FAST: |
151 | * |
152 | * quick check whether this is an xslt element |
153 | */ |
154 | #define IS_XSLT_ELEM_FAST(n) \ |
155 | (((n) != NULL) && ((n)->ns != NULL) && \ |
156 | (xmlStrEqual((n)->ns->href, XSLT_NAMESPACE))) |
157 | |
158 | /** |
159 | * IS_XSLT_ATTR_FAST: |
160 | * |
161 | * quick check for xslt namespace attribute |
162 | */ |
163 | #define IS_XSLT_ATTR_FAST(a) \ |
164 | (((a) != NULL) && ((a)->ns != NULL) && \ |
165 | (xmlStrEqual((a)->ns->href, XSLT_NAMESPACE))) |
166 | |
167 | |
168 | #endif /* XSLT_REFACTORED_XSLT_NSCOMP */ |
169 | |
170 | |
171 | /** |
172 | * XSLT_REFACTORED_MANDATORY_VERSION: |
173 | * |
174 | * TODO: Currently disabled to surpress regression test failures, since |
175 | * the old behaviour was that a missing version attribute |
176 | * produced a only a warning and not an error, which was incerrect. |
177 | * So the regression tests need to be fixed if this is enabled. |
178 | */ |
179 | /* #define XSLT_REFACTORED_MANDATORY_VERSION */ |
180 | |
181 | /** |
182 | * xsltPointerList: |
183 | * |
184 | * Pointer-list for various purposes. |
185 | */ |
186 | typedef struct _xsltPointerList xsltPointerList; |
187 | typedef xsltPointerList *xsltPointerListPtr; |
188 | struct _xsltPointerList { |
189 | void **items; |
190 | int number; |
191 | int size; |
192 | }; |
193 | |
194 | #endif |
195 | |
196 | /** |
197 | * XSLT_REFACTORED_PARSING: |
198 | * |
199 | * Internal define to enable the refactored parts of Libxslt |
200 | * related to parsing. |
201 | */ |
202 | /* #define XSLT_REFACTORED_PARSING */ |
203 | |
204 | /** |
205 | * XSLT_MAX_SORT: |
206 | * |
207 | * Max number of specified xsl:sort on an element. |
208 | */ |
209 | #define XSLT_MAX_SORT 15 |
210 | |
211 | /** |
212 | * XSLT_PAT_NO_PRIORITY: |
213 | * |
214 | * Specific value for pattern without priority expressed. |
215 | */ |
216 | #define XSLT_PAT_NO_PRIORITY -12345789 |
217 | |
218 | /** |
219 | * xsltRuntimeExtra: |
220 | * |
221 | * Extra information added to the transformation context. |
222 | */ |
223 | typedef struct _xsltRuntimeExtra ; |
224 | typedef xsltRuntimeExtra *; |
225 | struct { |
226 | void *; /* pointer to the extra data */ |
227 | xmlFreeFunc ; /* pointer to the deallocation routine */ |
228 | union { /* dual-purpose field */ |
229 | void *; /* data not needing deallocation */ |
230 | int ; /* integer value storage */ |
231 | } ; |
232 | }; |
233 | |
234 | /** |
235 | * XSLT_RUNTIME_EXTRA_LST: |
236 | * @ctxt: the transformation context |
237 | * @nr: the index |
238 | * |
239 | * Macro used to access extra information stored in the context |
240 | */ |
241 | #define (ctxt, nr) (ctxt)->extras[(nr)].info |
242 | /** |
243 | * XSLT_RUNTIME_EXTRA_FREE: |
244 | * @ctxt: the transformation context |
245 | * @nr: the index |
246 | * |
247 | * Macro used to free extra information stored in the context |
248 | */ |
249 | #define (ctxt, nr) (ctxt)->extras[(nr)].deallocate |
250 | /** |
251 | * XSLT_RUNTIME_EXTRA: |
252 | * @ctxt: the transformation context |
253 | * @nr: the index |
254 | * |
255 | * Macro used to define extra information stored in the context |
256 | */ |
257 | #define (ctxt, nr, typ) (ctxt)->extras[(nr)].val.typ |
258 | |
259 | /** |
260 | * xsltTemplate: |
261 | * |
262 | * The in-memory structure corresponding to an XSLT Template. |
263 | */ |
264 | typedef struct _xsltTemplate xsltTemplate; |
265 | typedef xsltTemplate *xsltTemplatePtr; |
266 | struct _xsltTemplate { |
267 | struct _xsltTemplate *next;/* chained list sorted by priority */ |
268 | struct _xsltStylesheet *style;/* the containing stylesheet */ |
269 | xmlChar *match; /* the matching string */ |
270 | float priority; /* as given from the stylesheet, not computed */ |
271 | const xmlChar *name; /* the local part of the name QName */ |
272 | const xmlChar *nameURI; /* the URI part of the name QName */ |
273 | const xmlChar *mode;/* the local part of the mode QName */ |
274 | const xmlChar *modeURI;/* the URI part of the mode QName */ |
275 | xmlNodePtr content; /* the template replacement value */ |
276 | xmlNodePtr elem; /* the source element */ |
277 | |
278 | /* |
279 | * TODO: @inheritedNsNr and @inheritedNs won't be used in the |
280 | * refactored code. |
281 | */ |
282 | int inheritedNsNr; /* number of inherited namespaces */ |
283 | xmlNsPtr *inheritedNs;/* inherited non-excluded namespaces */ |
284 | |
285 | /* Profiling information */ |
286 | int nbCalls; /* the number of time the template was called */ |
287 | unsigned long time; /* the time spent in this template */ |
288 | void *params; /* xsl:param instructions */ |
289 | |
290 | int templNr; /* Nb of templates in the stack */ |
291 | int templMax; /* Size of the templtes stack */ |
292 | xsltTemplatePtr *templCalledTab; /* templates called */ |
293 | int *templCountTab; /* .. and how often */ |
294 | }; |
295 | |
296 | /** |
297 | * xsltDecimalFormat: |
298 | * |
299 | * Data structure of decimal-format. |
300 | */ |
301 | typedef struct _xsltDecimalFormat xsltDecimalFormat; |
302 | typedef xsltDecimalFormat *xsltDecimalFormatPtr; |
303 | struct _xsltDecimalFormat { |
304 | struct _xsltDecimalFormat *next; /* chained list */ |
305 | xmlChar *name; |
306 | /* Used for interpretation of pattern */ |
307 | xmlChar *digit; |
308 | xmlChar *patternSeparator; |
309 | /* May appear in result */ |
310 | xmlChar *minusSign; |
311 | xmlChar *infinity; |
312 | xmlChar *noNumber; /* Not-a-number */ |
313 | /* Used for interpretation of pattern and may appear in result */ |
314 | xmlChar *decimalPoint; |
315 | xmlChar *grouping; |
316 | xmlChar *percent; |
317 | xmlChar *permille; |
318 | xmlChar *zeroDigit; |
319 | const xmlChar *nsUri; |
320 | }; |
321 | |
322 | /** |
323 | * xsltDocument: |
324 | * |
325 | * Data structure associated to a parsed document. |
326 | */ |
327 | typedef struct _xsltDocument xsltDocument; |
328 | typedef xsltDocument *xsltDocumentPtr; |
329 | struct _xsltDocument { |
330 | struct _xsltDocument *next; /* documents are kept in a chained list */ |
331 | int main; /* is this the main document */ |
332 | xmlDocPtr doc; /* the parsed document */ |
333 | void *keys; /* key tables storage */ |
334 | struct _xsltDocument *includes; /* subsidiary includes */ |
335 | int preproc; /* pre-processing already done */ |
336 | int nbKeysComputed; |
337 | }; |
338 | |
339 | /** |
340 | * xsltKeyDef: |
341 | * |
342 | * Representation of an xsl:key. |
343 | */ |
344 | typedef struct _xsltKeyDef xsltKeyDef; |
345 | typedef xsltKeyDef *xsltKeyDefPtr; |
346 | struct _xsltKeyDef { |
347 | struct _xsltKeyDef *next; |
348 | xmlNodePtr inst; |
349 | xmlChar *name; |
350 | xmlChar *nameURI; |
351 | xmlChar *match; |
352 | xmlChar *use; |
353 | xmlXPathCompExprPtr comp; |
354 | xmlXPathCompExprPtr usecomp; |
355 | xmlNsPtr *nsList; /* the namespaces in scope */ |
356 | int nsNr; /* the number of namespaces in scope */ |
357 | }; |
358 | |
359 | /** |
360 | * xsltKeyTable: |
361 | * |
362 | * Holds the computed keys for key definitions of the same QName. |
363 | * Is owned by an xsltDocument. |
364 | */ |
365 | typedef struct _xsltKeyTable xsltKeyTable; |
366 | typedef xsltKeyTable *xsltKeyTablePtr; |
367 | struct _xsltKeyTable { |
368 | struct _xsltKeyTable *next; |
369 | xmlChar *name; |
370 | xmlChar *nameURI; |
371 | xmlHashTablePtr keys; |
372 | }; |
373 | |
374 | /* |
375 | * The in-memory structure corresponding to an XSLT Stylesheet. |
376 | * NOTE: most of the content is simply linked from the doc tree |
377 | * structure, no specific allocation is made. |
378 | */ |
379 | typedef struct _xsltStylesheet xsltStylesheet; |
380 | typedef xsltStylesheet *xsltStylesheetPtr; |
381 | |
382 | typedef struct _xsltTransformContext xsltTransformContext; |
383 | typedef xsltTransformContext *xsltTransformContextPtr; |
384 | |
385 | /** |
386 | * xsltElemPreComp: |
387 | * |
388 | * The in-memory structure corresponding to element precomputed data, |
389 | * designed to be extended by extension implementors. |
390 | */ |
391 | typedef struct _xsltElemPreComp xsltElemPreComp; |
392 | typedef xsltElemPreComp *xsltElemPreCompPtr; |
393 | |
394 | /** |
395 | * xsltTransformFunction: |
396 | * @ctxt: the XSLT transformation context |
397 | * @node: the input node |
398 | * @inst: the stylesheet node |
399 | * @comp: the compiled information from the stylesheet |
400 | * |
401 | * Signature of the function associated to elements part of the |
402 | * stylesheet language like xsl:if or xsl:apply-templates. |
403 | */ |
404 | typedef void (*xsltTransformFunction) (xsltTransformContextPtr ctxt, |
405 | xmlNodePtr node, |
406 | xmlNodePtr inst, |
407 | xsltElemPreCompPtr comp); |
408 | |
409 | /** |
410 | * xsltSortFunc: |
411 | * @ctxt: a transformation context |
412 | * @sorts: the node-set to sort |
413 | * @nbsorts: the number of sorts |
414 | * |
415 | * Signature of the function to use during sorting |
416 | */ |
417 | typedef void (*xsltSortFunc) (xsltTransformContextPtr ctxt, xmlNodePtr *sorts, |
418 | int nbsorts); |
419 | |
420 | typedef enum { |
421 | XSLT_FUNC_COPY=1, |
422 | XSLT_FUNC_SORT, |
423 | XSLT_FUNC_TEXT, |
424 | XSLT_FUNC_ELEMENT, |
425 | XSLT_FUNC_ATTRIBUTE, |
426 | , |
427 | XSLT_FUNC_PI, |
428 | XSLT_FUNC_COPYOF, |
429 | XSLT_FUNC_VALUEOF, |
430 | XSLT_FUNC_NUMBER, |
431 | XSLT_FUNC_APPLYIMPORTS, |
432 | XSLT_FUNC_CALLTEMPLATE, |
433 | XSLT_FUNC_APPLYTEMPLATES, |
434 | XSLT_FUNC_CHOOSE, |
435 | XSLT_FUNC_IF, |
436 | XSLT_FUNC_FOREACH, |
437 | XSLT_FUNC_DOCUMENT, |
438 | XSLT_FUNC_WITHPARAM, |
439 | XSLT_FUNC_PARAM, |
440 | XSLT_FUNC_VARIABLE, |
441 | XSLT_FUNC_WHEN, |
442 | XSLT_FUNC_EXTENSION |
443 | #ifdef XSLT_REFACTORED |
444 | , |
445 | XSLT_FUNC_OTHERWISE, |
446 | XSLT_FUNC_FALLBACK, |
447 | XSLT_FUNC_MESSAGE, |
448 | XSLT_FUNC_INCLUDE, |
449 | XSLT_FUNC_ATTRSET, |
450 | XSLT_FUNC_LITERAL_RESULT_ELEMENT, |
451 | XSLT_FUNC_UNKOWN_FORWARDS_COMPAT |
452 | #endif |
453 | } xsltStyleType; |
454 | |
455 | /** |
456 | * xsltElemPreCompDeallocator: |
457 | * @comp: the #xsltElemPreComp to free up |
458 | * |
459 | * Deallocates an #xsltElemPreComp structure. |
460 | */ |
461 | typedef void (*xsltElemPreCompDeallocator) (xsltElemPreCompPtr comp); |
462 | |
463 | /** |
464 | * xsltElemPreComp: |
465 | * |
466 | * The basic structure for compiled items of the AST of the XSLT processor. |
467 | * This structure is also intended to be extended by extension implementors. |
468 | * TODO: This is somehow not nice, since it has a "free" field, which |
469 | * derived stylesheet-structs do not have. |
470 | */ |
471 | struct _xsltElemPreComp { |
472 | xsltElemPreCompPtr next; /* next item in the global chained |
473 | list held by xsltStylesheet. */ |
474 | xsltStyleType type; /* type of the element */ |
475 | xsltTransformFunction func; /* handling function */ |
476 | xmlNodePtr inst; /* the node in the stylesheet's tree |
477 | corresponding to this item */ |
478 | |
479 | /* end of common part */ |
480 | xsltElemPreCompDeallocator free; /* the deallocator */ |
481 | }; |
482 | |
483 | /** |
484 | * xsltStylePreComp: |
485 | * |
486 | * The abstract basic structure for items of the XSLT processor. |
487 | * This includes: |
488 | * 1) compiled forms of XSLT instructions (xsl:if, xsl:attribute, etc.) |
489 | * 2) compiled forms of literal result elements |
490 | * 3) compiled forms of extension elements |
491 | */ |
492 | typedef struct _xsltStylePreComp xsltStylePreComp; |
493 | typedef xsltStylePreComp *xsltStylePreCompPtr; |
494 | |
495 | #ifdef XSLT_REFACTORED |
496 | |
497 | /* |
498 | * Some pointer-list utility functions. |
499 | */ |
500 | XSLTPUBFUN xsltPointerListPtr XSLTCALL |
501 | xsltPointerListCreate (int initialSize); |
502 | XSLTPUBFUN void XSLTCALL |
503 | xsltPointerListFree (xsltPointerListPtr list); |
504 | XSLTPUBFUN void XSLTCALL |
505 | xsltPointerListClear (xsltPointerListPtr list); |
506 | XSLTPUBFUN int XSLTCALL |
507 | xsltPointerListAddSize (xsltPointerListPtr list, |
508 | void *item, |
509 | int initialSize); |
510 | |
511 | /************************************************************************ |
512 | * * |
513 | * Refactored structures * |
514 | * * |
515 | ************************************************************************/ |
516 | |
517 | typedef struct _xsltNsListContainer xsltNsListContainer; |
518 | typedef xsltNsListContainer *xsltNsListContainerPtr; |
519 | struct _xsltNsListContainer { |
520 | xmlNsPtr *list; |
521 | int totalNumber; |
522 | int xpathNumber; |
523 | }; |
524 | |
525 | /** |
526 | * XSLT_ITEM_COMPATIBILITY_FIELDS: |
527 | * |
528 | * Fields for API compatibility to the structure |
529 | * _xsltElemPreComp which is used for extension functions. |
530 | * Note that @next is used for storage; it does not reflect a next |
531 | * sibling in the tree. |
532 | * TODO: Evaluate if we really need such a compatibility. |
533 | */ |
534 | #define XSLT_ITEM_COMPATIBILITY_FIELDS \ |
535 | xsltElemPreCompPtr next;\ |
536 | xsltStyleType type;\ |
537 | xsltTransformFunction func;\ |
538 | xmlNodePtr inst; |
539 | |
540 | /** |
541 | * XSLT_ITEM_NAVIGATION_FIELDS: |
542 | * |
543 | * Currently empty. |
544 | * TODO: It is intended to hold navigational fields in the future. |
545 | */ |
546 | #define XSLT_ITEM_NAVIGATION_FIELDS |
547 | /* |
548 | xsltStylePreCompPtr parent;\ |
549 | xsltStylePreCompPtr children;\ |
550 | xsltStylePreCompPtr nextItem; |
551 | */ |
552 | |
553 | /** |
554 | * XSLT_ITEM_NSINSCOPE_FIELDS: |
555 | * |
556 | * The in-scope namespaces. |
557 | */ |
558 | #define XSLT_ITEM_NSINSCOPE_FIELDS xsltNsListContainerPtr inScopeNs; |
559 | |
560 | /** |
561 | * XSLT_ITEM_COMMON_FIELDS: |
562 | * |
563 | * Common fields used for all items. |
564 | */ |
565 | #define XSLT_ITEM_COMMON_FIELDS \ |
566 | XSLT_ITEM_COMPATIBILITY_FIELDS \ |
567 | XSLT_ITEM_NAVIGATION_FIELDS \ |
568 | XSLT_ITEM_NSINSCOPE_FIELDS |
569 | |
570 | /** |
571 | * _xsltStylePreComp: |
572 | * |
573 | * The abstract basic structure for items of the XSLT processor. |
574 | * This includes: |
575 | * 1) compiled forms of XSLT instructions (e.g. xsl:if, xsl:attribute, etc.) |
576 | * 2) compiled forms of literal result elements |
577 | * 3) various properties for XSLT instructions (e.g. xsl:when, |
578 | * xsl:with-param) |
579 | * |
580 | * REVISIT TODO: Keep this structure equal to the fields |
581 | * defined by XSLT_ITEM_COMMON_FIELDS |
582 | */ |
583 | struct _xsltStylePreComp { |
584 | xsltElemPreCompPtr next; /* next item in the global chained |
585 | list held by xsltStylesheet */ |
586 | xsltStyleType type; /* type of the item */ |
587 | xsltTransformFunction func; /* handling function */ |
588 | xmlNodePtr inst; /* the node in the stylesheet's tree |
589 | corresponding to this item. */ |
590 | /* Currently no navigational fields. */ |
591 | xsltNsListContainerPtr inScopeNs; |
592 | }; |
593 | |
594 | /** |
595 | * xsltStyleBasicEmptyItem: |
596 | * |
597 | * Abstract structure only used as a short-cut for |
598 | * XSLT items with no extra fields. |
599 | * NOTE that it is intended that this structure looks the same as |
600 | * _xsltStylePreComp. |
601 | */ |
602 | typedef struct _xsltStyleBasicEmptyItem xsltStyleBasicEmptyItem; |
603 | typedef xsltStyleBasicEmptyItem *xsltStyleBasicEmptyItemPtr; |
604 | |
605 | struct _xsltStyleBasicEmptyItem { |
606 | XSLT_ITEM_COMMON_FIELDS |
607 | }; |
608 | |
609 | /** |
610 | * xsltStyleBasicExpressionItem: |
611 | * |
612 | * Abstract structure only used as a short-cut for |
613 | * XSLT items with just an expression. |
614 | */ |
615 | typedef struct _xsltStyleBasicExpressionItem xsltStyleBasicExpressionItem; |
616 | typedef xsltStyleBasicExpressionItem *xsltStyleBasicExpressionItemPtr; |
617 | |
618 | struct _xsltStyleBasicExpressionItem { |
619 | XSLT_ITEM_COMMON_FIELDS |
620 | |
621 | const xmlChar *select; /* TODO: Change this to "expression". */ |
622 | xmlXPathCompExprPtr comp; /* TODO: Change this to compExpr. */ |
623 | }; |
624 | |
625 | /************************************************************************ |
626 | * * |
627 | * XSLT-instructions/declarations * |
628 | * * |
629 | ************************************************************************/ |
630 | |
631 | /** |
632 | * xsltStyleItemElement: |
633 | * |
634 | * <!-- Category: instruction --> |
635 | * <xsl:element |
636 | * name = { qname } |
637 | * namespace = { uri-reference } |
638 | * use-attribute-sets = qnames> |
639 | * <!-- Content: template --> |
640 | * </xsl:element> |
641 | */ |
642 | typedef struct _xsltStyleItemElement xsltStyleItemElement; |
643 | typedef xsltStyleItemElement *xsltStyleItemElementPtr; |
644 | |
645 | struct _xsltStyleItemElement { |
646 | XSLT_ITEM_COMMON_FIELDS |
647 | |
648 | const xmlChar *use; |
649 | int has_use; |
650 | const xmlChar *name; |
651 | int has_name; |
652 | const xmlChar *ns; |
653 | const xmlChar *nsPrefix; |
654 | int has_ns; |
655 | }; |
656 | |
657 | /** |
658 | * xsltStyleItemAttribute: |
659 | * |
660 | * <!-- Category: instruction --> |
661 | * <xsl:attribute |
662 | * name = { qname } |
663 | * namespace = { uri-reference }> |
664 | * <!-- Content: template --> |
665 | * </xsl:attribute> |
666 | */ |
667 | typedef struct _xsltStyleItemAttribute xsltStyleItemAttribute; |
668 | typedef xsltStyleItemAttribute *xsltStyleItemAttributePtr; |
669 | |
670 | struct _xsltStyleItemAttribute { |
671 | XSLT_ITEM_COMMON_FIELDS |
672 | const xmlChar *name; |
673 | int has_name; |
674 | const xmlChar *ns; |
675 | const xmlChar *nsPrefix; |
676 | int has_ns; |
677 | }; |
678 | |
679 | /** |
680 | * xsltStyleItemText: |
681 | * |
682 | * <!-- Category: instruction --> |
683 | * <xsl:text |
684 | * disable-output-escaping = "yes" | "no"> |
685 | * <!-- Content: #PCDATA --> |
686 | * </xsl:text> |
687 | */ |
688 | typedef struct _xsltStyleItemText xsltStyleItemText; |
689 | typedef xsltStyleItemText *xsltStyleItemTextPtr; |
690 | |
691 | struct _xsltStyleItemText { |
692 | XSLT_ITEM_COMMON_FIELDS |
693 | int noescape; /* text */ |
694 | }; |
695 | |
696 | /** |
697 | * xsltStyleItemComment: |
698 | * |
699 | * <!-- Category: instruction --> |
700 | * <xsl:comment> |
701 | * <!-- Content: template --> |
702 | * </xsl:comment> |
703 | */ |
704 | typedef xsltStyleBasicEmptyItem xsltStyleItemComment; |
705 | typedef xsltStyleItemComment *xsltStyleItemCommentPtr; |
706 | |
707 | /** |
708 | * xsltStyleItemPI: |
709 | * |
710 | * <!-- Category: instruction --> |
711 | * <xsl:processing-instruction |
712 | * name = { ncname }> |
713 | * <!-- Content: template --> |
714 | * </xsl:processing-instruction> |
715 | */ |
716 | typedef struct _xsltStyleItemPI xsltStyleItemPI; |
717 | typedef xsltStyleItemPI *xsltStyleItemPIPtr; |
718 | |
719 | struct _xsltStyleItemPI { |
720 | XSLT_ITEM_COMMON_FIELDS |
721 | const xmlChar *name; |
722 | int has_name; |
723 | }; |
724 | |
725 | /** |
726 | * xsltStyleItemApplyImports: |
727 | * |
728 | * <!-- Category: instruction --> |
729 | * <xsl:apply-imports /> |
730 | */ |
731 | typedef xsltStyleBasicEmptyItem xsltStyleItemApplyImports; |
732 | typedef xsltStyleItemApplyImports *xsltStyleItemApplyImportsPtr; |
733 | |
734 | /** |
735 | * xsltStyleItemApplyTemplates: |
736 | * |
737 | * <!-- Category: instruction --> |
738 | * <xsl:apply-templates |
739 | * select = node-set-expression |
740 | * mode = qname> |
741 | * <!-- Content: (xsl:sort | xsl:with-param)* --> |
742 | * </xsl:apply-templates> |
743 | */ |
744 | typedef struct _xsltStyleItemApplyTemplates xsltStyleItemApplyTemplates; |
745 | typedef xsltStyleItemApplyTemplates *xsltStyleItemApplyTemplatesPtr; |
746 | |
747 | struct _xsltStyleItemApplyTemplates { |
748 | XSLT_ITEM_COMMON_FIELDS |
749 | |
750 | const xmlChar *mode; /* apply-templates */ |
751 | const xmlChar *modeURI; /* apply-templates */ |
752 | const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ |
753 | xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ |
754 | /* TODO: with-params */ |
755 | }; |
756 | |
757 | /** |
758 | * xsltStyleItemCallTemplate: |
759 | * |
760 | * <!-- Category: instruction --> |
761 | * <xsl:call-template |
762 | * name = qname> |
763 | * <!-- Content: xsl:with-param* --> |
764 | * </xsl:call-template> |
765 | */ |
766 | typedef struct _xsltStyleItemCallTemplate xsltStyleItemCallTemplate; |
767 | typedef xsltStyleItemCallTemplate *xsltStyleItemCallTemplatePtr; |
768 | |
769 | struct _xsltStyleItemCallTemplate { |
770 | XSLT_ITEM_COMMON_FIELDS |
771 | |
772 | xsltTemplatePtr templ; /* call-template */ |
773 | const xmlChar *name; /* element, attribute, pi */ |
774 | int has_name; /* element, attribute, pi */ |
775 | const xmlChar *ns; /* element */ |
776 | int has_ns; /* element */ |
777 | /* TODO: with-params */ |
778 | }; |
779 | |
780 | /** |
781 | * xsltStyleItemCopy: |
782 | * |
783 | * <!-- Category: instruction --> |
784 | * <xsl:copy |
785 | * use-attribute-sets = qnames> |
786 | * <!-- Content: template --> |
787 | * </xsl:copy> |
788 | */ |
789 | typedef struct _xsltStyleItemCopy xsltStyleItemCopy; |
790 | typedef xsltStyleItemCopy *xsltStyleItemCopyPtr; |
791 | |
792 | struct _xsltStyleItemCopy { |
793 | XSLT_ITEM_COMMON_FIELDS |
794 | const xmlChar *use; /* copy, element */ |
795 | int has_use; /* copy, element */ |
796 | }; |
797 | |
798 | /** |
799 | * xsltStyleItemIf: |
800 | * |
801 | * <!-- Category: instruction --> |
802 | * <xsl:if |
803 | * test = boolean-expression> |
804 | * <!-- Content: template --> |
805 | * </xsl:if> |
806 | */ |
807 | typedef struct _xsltStyleItemIf xsltStyleItemIf; |
808 | typedef xsltStyleItemIf *xsltStyleItemIfPtr; |
809 | |
810 | struct _xsltStyleItemIf { |
811 | XSLT_ITEM_COMMON_FIELDS |
812 | |
813 | const xmlChar *test; /* if */ |
814 | xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ |
815 | }; |
816 | |
817 | |
818 | /** |
819 | * xsltStyleItemCopyOf: |
820 | * |
821 | * <!-- Category: instruction --> |
822 | * <xsl:copy-of |
823 | * select = expression /> |
824 | */ |
825 | typedef xsltStyleBasicExpressionItem xsltStyleItemCopyOf; |
826 | typedef xsltStyleItemCopyOf *xsltStyleItemCopyOfPtr; |
827 | |
828 | /** |
829 | * xsltStyleItemValueOf: |
830 | * |
831 | * <!-- Category: instruction --> |
832 | * <xsl:value-of |
833 | * select = string-expression |
834 | * disable-output-escaping = "yes" | "no" /> |
835 | */ |
836 | typedef struct _xsltStyleItemValueOf xsltStyleItemValueOf; |
837 | typedef xsltStyleItemValueOf *xsltStyleItemValueOfPtr; |
838 | |
839 | struct _xsltStyleItemValueOf { |
840 | XSLT_ITEM_COMMON_FIELDS |
841 | |
842 | const xmlChar *select; |
843 | xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ |
844 | int noescape; |
845 | }; |
846 | |
847 | /** |
848 | * xsltStyleItemNumber: |
849 | * |
850 | * <!-- Category: instruction --> |
851 | * <xsl:number |
852 | * level = "single" | "multiple" | "any" |
853 | * count = pattern |
854 | * from = pattern |
855 | * value = number-expression |
856 | * format = { string } |
857 | * lang = { nmtoken } |
858 | * letter-value = { "alphabetic" | "traditional" } |
859 | * grouping-separator = { char } |
860 | * grouping-size = { number } /> |
861 | */ |
862 | typedef struct _xsltStyleItemNumber xsltStyleItemNumber; |
863 | typedef xsltStyleItemNumber *xsltStyleItemNumberPtr; |
864 | |
865 | struct _xsltStyleItemNumber { |
866 | XSLT_ITEM_COMMON_FIELDS |
867 | xsltNumberData numdata; /* number */ |
868 | }; |
869 | |
870 | /** |
871 | * xsltStyleItemChoose: |
872 | * |
873 | * <!-- Category: instruction --> |
874 | * <xsl:choose> |
875 | * <!-- Content: (xsl:when+, xsl:otherwise?) --> |
876 | * </xsl:choose> |
877 | */ |
878 | typedef xsltStyleBasicEmptyItem xsltStyleItemChoose; |
879 | typedef xsltStyleItemChoose *xsltStyleItemChoosePtr; |
880 | |
881 | /** |
882 | * xsltStyleItemFallback: |
883 | * |
884 | * <!-- Category: instruction --> |
885 | * <xsl:fallback> |
886 | * <!-- Content: template --> |
887 | * </xsl:fallback> |
888 | */ |
889 | typedef xsltStyleBasicEmptyItem xsltStyleItemFallback; |
890 | typedef xsltStyleItemFallback *xsltStyleItemFallbackPtr; |
891 | |
892 | /** |
893 | * xsltStyleItemForEach: |
894 | * |
895 | * <!-- Category: instruction --> |
896 | * <xsl:for-each |
897 | * select = node-set-expression> |
898 | * <!-- Content: (xsl:sort*, template) --> |
899 | * </xsl:for-each> |
900 | */ |
901 | typedef xsltStyleBasicExpressionItem xsltStyleItemForEach; |
902 | typedef xsltStyleItemForEach *xsltStyleItemForEachPtr; |
903 | |
904 | /** |
905 | * xsltStyleItemMessage: |
906 | * |
907 | * <!-- Category: instruction --> |
908 | * <xsl:message |
909 | * terminate = "yes" | "no"> |
910 | * <!-- Content: template --> |
911 | * </xsl:message> |
912 | */ |
913 | typedef struct _xsltStyleItemMessage xsltStyleItemMessage; |
914 | typedef xsltStyleItemMessage *xsltStyleItemMessagePtr; |
915 | |
916 | struct _xsltStyleItemMessage { |
917 | XSLT_ITEM_COMMON_FIELDS |
918 | int terminate; |
919 | }; |
920 | |
921 | /** |
922 | * xsltStyleItemDocument: |
923 | * |
924 | * NOTE: This is not an instruction of XSLT 1.0. |
925 | */ |
926 | typedef struct _xsltStyleItemDocument xsltStyleItemDocument; |
927 | typedef xsltStyleItemDocument *xsltStyleItemDocumentPtr; |
928 | |
929 | struct _xsltStyleItemDocument { |
930 | XSLT_ITEM_COMMON_FIELDS |
931 | int ver11; /* assigned: in xsltDocumentComp; |
932 | read: nowhere; |
933 | TODO: Check if we need. */ |
934 | const xmlChar *filename; /* document URL */ |
935 | int has_filename; |
936 | }; |
937 | |
938 | /************************************************************************ |
939 | * * |
940 | * Non-instructions (actually properties of instructions/declarations) * |
941 | * * |
942 | ************************************************************************/ |
943 | |
944 | /** |
945 | * xsltStyleBasicItemVariable: |
946 | * |
947 | * Basic struct for xsl:variable, xsl:param and xsl:with-param. |
948 | * It's currently important to have equal fields, since |
949 | * xsltParseStylesheetCallerParam() is used with xsl:with-param from |
950 | * the xslt side and with xsl:param from the exslt side (in |
951 | * exsltFuncFunctionFunction()). |
952 | * |
953 | * FUTURE NOTE: In XSLT 2.0 xsl:param, xsl:variable and xsl:with-param |
954 | * have additional different fields. |
955 | */ |
956 | typedef struct _xsltStyleBasicItemVariable xsltStyleBasicItemVariable; |
957 | typedef xsltStyleBasicItemVariable *xsltStyleBasicItemVariablePtr; |
958 | |
959 | struct _xsltStyleBasicItemVariable { |
960 | XSLT_ITEM_COMMON_FIELDS |
961 | |
962 | const xmlChar *select; |
963 | xmlXPathCompExprPtr comp; |
964 | |
965 | const xmlChar *name; |
966 | int has_name; |
967 | const xmlChar *ns; |
968 | int has_ns; |
969 | }; |
970 | |
971 | /** |
972 | * xsltStyleItemVariable: |
973 | * |
974 | * <!-- Category: top-level-element --> |
975 | * <xsl:param |
976 | * name = qname |
977 | * select = expression> |
978 | * <!-- Content: template --> |
979 | * </xsl:param> |
980 | */ |
981 | typedef xsltStyleBasicItemVariable xsltStyleItemVariable; |
982 | typedef xsltStyleItemVariable *xsltStyleItemVariablePtr; |
983 | |
984 | /** |
985 | * xsltStyleItemParam: |
986 | * |
987 | * <!-- Category: top-level-element --> |
988 | * <xsl:param |
989 | * name = qname |
990 | * select = expression> |
991 | * <!-- Content: template --> |
992 | * </xsl:param> |
993 | */ |
994 | typedef struct _xsltStyleItemParam xsltStyleItemParam; |
995 | typedef xsltStyleItemParam *xsltStyleItemParamPtr; |
996 | |
997 | struct _xsltStyleItemParam { |
998 | XSLT_ITEM_COMMON_FIELDS |
999 | |
1000 | const xmlChar *select; |
1001 | xmlXPathCompExprPtr comp; |
1002 | |
1003 | const xmlChar *name; |
1004 | int has_name; |
1005 | const xmlChar *ns; |
1006 | int has_ns; |
1007 | }; |
1008 | |
1009 | /** |
1010 | * xsltStyleItemWithParam: |
1011 | * |
1012 | * <xsl:with-param |
1013 | * name = qname |
1014 | * select = expression> |
1015 | * <!-- Content: template --> |
1016 | * </xsl:with-param> |
1017 | */ |
1018 | typedef xsltStyleBasicItemVariable xsltStyleItemWithParam; |
1019 | typedef xsltStyleItemWithParam *xsltStyleItemWithParamPtr; |
1020 | |
1021 | /** |
1022 | * xsltStyleItemSort: |
1023 | * |
1024 | * Reflects the XSLT xsl:sort item. |
1025 | * Allowed parents: xsl:apply-templates, xsl:for-each |
1026 | * <xsl:sort |
1027 | * select = string-expression |
1028 | * lang = { nmtoken } |
1029 | * data-type = { "text" | "number" | qname-but-not-ncname } |
1030 | * order = { "ascending" | "descending" } |
1031 | * case-order = { "upper-first" | "lower-first" } /> |
1032 | */ |
1033 | typedef struct _xsltStyleItemSort xsltStyleItemSort; |
1034 | typedef xsltStyleItemSort *xsltStyleItemSortPtr; |
1035 | |
1036 | struct _xsltStyleItemSort { |
1037 | XSLT_ITEM_COMMON_FIELDS |
1038 | |
1039 | const xmlChar *stype; /* sort */ |
1040 | int has_stype; /* sort */ |
1041 | int number; /* sort */ |
1042 | const xmlChar *order; /* sort */ |
1043 | int has_order; /* sort */ |
1044 | int descending; /* sort */ |
1045 | const xmlChar *lang; /* sort */ |
1046 | int has_lang; /* sort */ |
1047 | xsltLocale locale; /* sort */ |
1048 | const xmlChar *case_order; /* sort */ |
1049 | int lower_first; /* sort */ |
1050 | |
1051 | const xmlChar *use; |
1052 | int has_use; |
1053 | |
1054 | const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ |
1055 | |
1056 | xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ |
1057 | }; |
1058 | |
1059 | |
1060 | /** |
1061 | * xsltStyleItemWhen: |
1062 | * |
1063 | * <xsl:when |
1064 | * test = boolean-expression> |
1065 | * <!-- Content: template --> |
1066 | * </xsl:when> |
1067 | * Allowed parent: xsl:choose |
1068 | */ |
1069 | typedef struct _xsltStyleItemWhen xsltStyleItemWhen; |
1070 | typedef xsltStyleItemWhen *xsltStyleItemWhenPtr; |
1071 | |
1072 | struct _xsltStyleItemWhen { |
1073 | XSLT_ITEM_COMMON_FIELDS |
1074 | |
1075 | const xmlChar *test; |
1076 | xmlXPathCompExprPtr comp; |
1077 | }; |
1078 | |
1079 | /** |
1080 | * xsltStyleItemOtherwise: |
1081 | * |
1082 | * Allowed parent: xsl:choose |
1083 | * <xsl:otherwise> |
1084 | * <!-- Content: template --> |
1085 | * </xsl:otherwise> |
1086 | */ |
1087 | typedef struct _xsltStyleItemOtherwise xsltStyleItemOtherwise; |
1088 | typedef xsltStyleItemOtherwise *xsltStyleItemOtherwisePtr; |
1089 | |
1090 | struct _xsltStyleItemOtherwise { |
1091 | XSLT_ITEM_COMMON_FIELDS |
1092 | }; |
1093 | |
1094 | typedef struct _xsltStyleItemInclude xsltStyleItemInclude; |
1095 | typedef xsltStyleItemInclude *xsltStyleItemIncludePtr; |
1096 | |
1097 | struct _xsltStyleItemInclude { |
1098 | XSLT_ITEM_COMMON_FIELDS |
1099 | xsltDocumentPtr include; |
1100 | }; |
1101 | |
1102 | /************************************************************************ |
1103 | * * |
1104 | * XSLT elements in forwards-compatible mode * |
1105 | * * |
1106 | ************************************************************************/ |
1107 | |
1108 | typedef struct _xsltStyleItemUknown xsltStyleItemUknown; |
1109 | typedef xsltStyleItemUknown *xsltStyleItemUknownPtr; |
1110 | struct _xsltStyleItemUknown { |
1111 | XSLT_ITEM_COMMON_FIELDS |
1112 | }; |
1113 | |
1114 | |
1115 | /************************************************************************ |
1116 | * * |
1117 | * Extension elements * |
1118 | * * |
1119 | ************************************************************************/ |
1120 | |
1121 | /* |
1122 | * xsltStyleItemExtElement: |
1123 | * |
1124 | * Reflects extension elements. |
1125 | * |
1126 | * NOTE: Due to the fact that the structure xsltElemPreComp is most |
1127 | * probably already heavily in use out there by users, so we cannot |
1128 | * easily change it, we'll create an intermediate structure which will |
1129 | * hold an xsltElemPreCompPtr. |
1130 | * BIG NOTE: The only problem I see here is that the user processes the |
1131 | * content of the stylesheet tree, possibly he'll lookup the node->psvi |
1132 | * fields in order to find subsequent extension functions. |
1133 | * In this case, the user's code will break, since the node->psvi |
1134 | * field will hold now the xsltStyleItemExtElementPtr and not |
1135 | * the xsltElemPreCompPtr. |
1136 | * However the place where the structure is anchored in the node-tree, |
1137 | * namely node->psvi, has beed already once been moved from node->_private |
1138 | * to node->psvi, so we have a precedent here, which, I think, should allow |
1139 | * us to change such semantics without headaches. |
1140 | */ |
1141 | typedef struct _xsltStyleItemExtElement xsltStyleItemExtElement; |
1142 | typedef xsltStyleItemExtElement *xsltStyleItemExtElementPtr; |
1143 | struct _xsltStyleItemExtElement { |
1144 | XSLT_ITEM_COMMON_FIELDS |
1145 | xsltElemPreCompPtr item; |
1146 | }; |
1147 | |
1148 | /************************************************************************ |
1149 | * * |
1150 | * Literal result elements * |
1151 | * * |
1152 | ************************************************************************/ |
1153 | |
1154 | typedef struct _xsltEffectiveNs xsltEffectiveNs; |
1155 | typedef xsltEffectiveNs *xsltEffectiveNsPtr; |
1156 | struct _xsltEffectiveNs { |
1157 | xsltEffectiveNsPtr nextInStore; /* storage next */ |
1158 | xsltEffectiveNsPtr next; /* next item in the list */ |
1159 | const xmlChar *prefix; |
1160 | const xmlChar *nsName; |
1161 | /* |
1162 | * Indicates if eclared on the literal result element; dunno if really |
1163 | * needed. |
1164 | */ |
1165 | int holdByElem; |
1166 | }; |
1167 | |
1168 | /* |
1169 | * Info for literal result elements. |
1170 | * This will be set on the elem->psvi field and will be |
1171 | * shared by literal result elements, which have the same |
1172 | * excluded result namespaces; i.e., this *won't* be created uniquely |
1173 | * for every literal result element. |
1174 | */ |
1175 | typedef struct _xsltStyleItemLRElementInfo xsltStyleItemLRElementInfo; |
1176 | typedef xsltStyleItemLRElementInfo *xsltStyleItemLRElementInfoPtr; |
1177 | struct _xsltStyleItemLRElementInfo { |
1178 | XSLT_ITEM_COMMON_FIELDS |
1179 | /* |
1180 | * @effectiveNs is the set of effective ns-nodes |
1181 | * on the literal result element, which will be added to the result |
1182 | * element if not already existing in the result tree. |
1183 | * This means that excluded namespaces (via exclude-result-prefixes, |
1184 | * extension-element-prefixes and the XSLT namespace) not added |
1185 | * to the set. |
1186 | * Namespace-aliasing was applied on the @effectiveNs. |
1187 | */ |
1188 | xsltEffectiveNsPtr effectiveNs; |
1189 | |
1190 | }; |
1191 | |
1192 | #ifdef XSLT_REFACTORED |
1193 | |
1194 | typedef struct _xsltNsAlias xsltNsAlias; |
1195 | typedef xsltNsAlias *xsltNsAliasPtr; |
1196 | struct _xsltNsAlias { |
1197 | xsltNsAliasPtr next; /* next in the list */ |
1198 | xmlNsPtr literalNs; |
1199 | xmlNsPtr targetNs; |
1200 | xmlDocPtr docOfTargetNs; |
1201 | }; |
1202 | #endif |
1203 | |
1204 | #ifdef XSLT_REFACTORED_XSLT_NSCOMP |
1205 | |
1206 | typedef struct _xsltNsMap xsltNsMap; |
1207 | typedef xsltNsMap *xsltNsMapPtr; |
1208 | struct _xsltNsMap { |
1209 | xsltNsMapPtr next; /* next in the list */ |
1210 | xmlDocPtr doc; |
1211 | xmlNodePtr elem; /* the element holding the ns-decl */ |
1212 | xmlNsPtr ns; /* the xmlNs structure holding the XML namespace name */ |
1213 | const xmlChar *origNsName; /* the original XML namespace name */ |
1214 | const xmlChar *newNsName; /* the mapped XML namespace name */ |
1215 | }; |
1216 | #endif |
1217 | |
1218 | /************************************************************************ |
1219 | * * |
1220 | * Compile-time structures for *internal* use only * |
1221 | * * |
1222 | ************************************************************************/ |
1223 | |
1224 | typedef struct _xsltPrincipalStylesheetData xsltPrincipalStylesheetData; |
1225 | typedef xsltPrincipalStylesheetData *xsltPrincipalStylesheetDataPtr; |
1226 | |
1227 | typedef struct _xsltNsList xsltNsList; |
1228 | typedef xsltNsList *xsltNsListPtr; |
1229 | struct _xsltNsList { |
1230 | xsltNsListPtr next; /* next in the list */ |
1231 | xmlNsPtr ns; |
1232 | }; |
1233 | |
1234 | /* |
1235 | * xsltVarInfo: |
1236 | * |
1237 | * Used at compilation time for parameters and variables. |
1238 | */ |
1239 | typedef struct _xsltVarInfo xsltVarInfo; |
1240 | typedef xsltVarInfo *xsltVarInfoPtr; |
1241 | struct _xsltVarInfo { |
1242 | xsltVarInfoPtr next; /* next in the list */ |
1243 | xsltVarInfoPtr prev; |
1244 | int depth; /* the depth in the tree */ |
1245 | const xmlChar *name; |
1246 | const xmlChar *nsName; |
1247 | }; |
1248 | |
1249 | /** |
1250 | * xsltCompilerNodeInfo: |
1251 | * |
1252 | * Per-node information during compile-time. |
1253 | */ |
1254 | typedef struct _xsltCompilerNodeInfo xsltCompilerNodeInfo; |
1255 | typedef xsltCompilerNodeInfo *xsltCompilerNodeInfoPtr; |
1256 | struct _xsltCompilerNodeInfo { |
1257 | xsltCompilerNodeInfoPtr next; |
1258 | xsltCompilerNodeInfoPtr prev; |
1259 | xmlNodePtr node; |
1260 | int depth; |
1261 | xsltTemplatePtr templ; /* The owning template */ |
1262 | int category; /* XSLT element, LR-element or |
1263 | extension element */ |
1264 | xsltStyleType type; |
1265 | xsltElemPreCompPtr item; /* The compiled information */ |
1266 | /* The current in-scope namespaces */ |
1267 | xsltNsListContainerPtr inScopeNs; |
1268 | /* The current excluded result namespaces */ |
1269 | xsltPointerListPtr exclResultNs; |
1270 | /* The current extension instruction namespaces */ |
1271 | xsltPointerListPtr extElemNs; |
1272 | |
1273 | /* The current info for literal result elements. */ |
1274 | xsltStyleItemLRElementInfoPtr litResElemInfo; |
1275 | /* |
1276 | * Set to 1 if in-scope namespaces changed, |
1277 | * or excluded result namespaces changed, |
1278 | * or extension element namespaces changed. |
1279 | * This will trigger creation of new infos |
1280 | * for literal result elements. |
1281 | */ |
1282 | int nsChanged; |
1283 | int preserveWhitespace; |
1284 | int stripWhitespace; |
1285 | int isRoot; /* whether this is the stylesheet's root node */ |
1286 | int forwardsCompat; /* whether forwards-compatible mode is enabled */ |
1287 | /* whether the content of an extension element was processed */ |
1288 | int extContentHandled; |
1289 | /* the type of the current child */ |
1290 | xsltStyleType curChildType; |
1291 | }; |
1292 | |
1293 | /** |
1294 | * XSLT_CCTXT: |
1295 | * |
1296 | * get pointer to compiler context |
1297 | */ |
1298 | #define XSLT_CCTXT(style) ((xsltCompilerCtxtPtr) style->compCtxt) |
1299 | |
1300 | typedef enum { |
1301 | XSLT_ERROR_SEVERITY_ERROR = 0, |
1302 | XSLT_ERROR_SEVERITY_WARNING |
1303 | } xsltErrorSeverityType; |
1304 | |
1305 | typedef struct _xsltCompilerCtxt xsltCompilerCtxt; |
1306 | typedef xsltCompilerCtxt *xsltCompilerCtxtPtr; |
1307 | struct _xsltCompilerCtxt { |
1308 | void *errorCtxt; /* user specific error context */ |
1309 | /* |
1310 | * used for error/warning reports; e.g. XSLT_ERROR_SEVERITY_WARNING */ |
1311 | xsltErrorSeverityType errSeverity; |
1312 | int warnings; /* TODO: number of warnings found at |
1313 | compilation */ |
1314 | int errors; /* TODO: number of errors found at |
1315 | compilation */ |
1316 | xmlDictPtr dict; |
1317 | xsltStylesheetPtr style; |
1318 | int simplified; /* whether this is a simplified stylesheet */ |
1319 | /* TODO: structured/unstructured error contexts. */ |
1320 | int depth; /* Current depth of processing */ |
1321 | |
1322 | xsltCompilerNodeInfoPtr inode; |
1323 | xsltCompilerNodeInfoPtr inodeList; |
1324 | xsltCompilerNodeInfoPtr inodeLast; |
1325 | xsltPointerListPtr tmpList; /* Used for various purposes */ |
1326 | /* |
1327 | * The XSLT version as specified by the stylesheet's root element. |
1328 | */ |
1329 | int isInclude; |
1330 | int hasForwardsCompat; /* whether forwards-compatible mode was used |
1331 | in a parsing episode */ |
1332 | int maxNodeInfos; /* TEMP TODO: just for the interest */ |
1333 | int maxLREs; /* TEMP TODO: just for the interest */ |
1334 | /* |
1335 | * In order to keep the old behaviour, applying strict rules of |
1336 | * the spec can be turned off. This has effect only on special |
1337 | * mechanisms like whitespace-stripping in the stylesheet. |
1338 | */ |
1339 | int strict; |
1340 | xsltPrincipalStylesheetDataPtr psData; |
1341 | xsltStyleItemUknownPtr unknownItem; |
1342 | int hasNsAliases; /* Indicator if there was an xsl:namespace-alias. */ |
1343 | xsltNsAliasPtr nsAliases; |
1344 | xsltVarInfoPtr ivars; /* Storage of local in-scope variables/params. */ |
1345 | xsltVarInfoPtr ivar; /* topmost local variable/param. */ |
1346 | }; |
1347 | |
1348 | #else /* XSLT_REFACTORED */ |
1349 | /* |
1350 | * The old structures before refactoring. |
1351 | */ |
1352 | |
1353 | /** |
1354 | * _xsltStylePreComp: |
1355 | * |
1356 | * The in-memory structure corresponding to XSLT stylesheet constructs |
1357 | * precomputed data. |
1358 | */ |
1359 | struct _xsltStylePreComp { |
1360 | xsltElemPreCompPtr next; /* chained list */ |
1361 | xsltStyleType type; /* type of the element */ |
1362 | xsltTransformFunction func; /* handling function */ |
1363 | xmlNodePtr inst; /* the instruction */ |
1364 | |
1365 | /* |
1366 | * Pre computed values. |
1367 | */ |
1368 | |
1369 | const xmlChar *stype; /* sort */ |
1370 | int has_stype; /* sort */ |
1371 | int number; /* sort */ |
1372 | const xmlChar *order; /* sort */ |
1373 | int has_order; /* sort */ |
1374 | int descending; /* sort */ |
1375 | const xmlChar *lang; /* sort */ |
1376 | int has_lang; /* sort */ |
1377 | xsltLocale locale; /* sort */ |
1378 | const xmlChar *case_order; /* sort */ |
1379 | int lower_first; /* sort */ |
1380 | |
1381 | const xmlChar *use; /* copy, element */ |
1382 | int has_use; /* copy, element */ |
1383 | |
1384 | int noescape; /* text */ |
1385 | |
1386 | const xmlChar *name; /* element, attribute, pi */ |
1387 | int has_name; /* element, attribute, pi */ |
1388 | const xmlChar *ns; /* element */ |
1389 | int has_ns; /* element */ |
1390 | |
1391 | const xmlChar *mode; /* apply-templates */ |
1392 | const xmlChar *modeURI; /* apply-templates */ |
1393 | |
1394 | const xmlChar *test; /* if */ |
1395 | |
1396 | xsltTemplatePtr templ; /* call-template */ |
1397 | |
1398 | const xmlChar *select; /* sort, copy-of, value-of, apply-templates */ |
1399 | |
1400 | int ver11; /* document */ |
1401 | const xmlChar *filename; /* document URL */ |
1402 | int has_filename; /* document */ |
1403 | |
1404 | xsltNumberData numdata; /* number */ |
1405 | |
1406 | xmlXPathCompExprPtr comp; /* a precompiled XPath expression */ |
1407 | xmlNsPtr *nsList; /* the namespaces in scope */ |
1408 | int nsNr; /* the number of namespaces in scope */ |
1409 | }; |
1410 | |
1411 | #endif /* XSLT_REFACTORED */ |
1412 | |
1413 | |
1414 | /* |
1415 | * The in-memory structure corresponding to an XSLT Variable |
1416 | * or Param. |
1417 | */ |
1418 | typedef struct _xsltStackElem xsltStackElem; |
1419 | typedef xsltStackElem *xsltStackElemPtr; |
1420 | struct _xsltStackElem { |
1421 | struct _xsltStackElem *next;/* chained list */ |
1422 | xsltStylePreCompPtr comp; /* the compiled form */ |
1423 | int computed; /* was the evaluation done */ |
1424 | const xmlChar *name; /* the local part of the name QName */ |
1425 | const xmlChar *nameURI; /* the URI part of the name QName */ |
1426 | const xmlChar *select; /* the eval string */ |
1427 | xmlNodePtr tree; /* the sequence constructor if no eval |
1428 | string or the location */ |
1429 | xmlXPathObjectPtr value; /* The value if computed */ |
1430 | xmlDocPtr fragment; /* The Result Tree Fragments (needed for XSLT 1.0) |
1431 | which are bound to the variable's lifetime. */ |
1432 | int level; /* the depth in the tree; |
1433 | -1 if persistent (e.g. a given xsl:with-param) */ |
1434 | xsltTransformContextPtr context; /* The transformation context; needed to cache |
1435 | the variables */ |
1436 | int flags; |
1437 | }; |
1438 | |
1439 | #ifdef XSLT_REFACTORED |
1440 | |
1441 | struct _xsltPrincipalStylesheetData { |
1442 | /* |
1443 | * Namespace dictionary for ns-prefixes and ns-names: |
1444 | * TODO: Shared between stylesheets, and XPath mechanisms. |
1445 | * Not used yet. |
1446 | */ |
1447 | xmlDictPtr namespaceDict; |
1448 | /* |
1449 | * Global list of in-scope namespaces. |
1450 | */ |
1451 | xsltPointerListPtr inScopeNamespaces; |
1452 | /* |
1453 | * Global list of information for [xsl:]excluded-result-prefixes. |
1454 | */ |
1455 | xsltPointerListPtr exclResultNamespaces; |
1456 | /* |
1457 | * Global list of information for [xsl:]extension-element-prefixes. |
1458 | */ |
1459 | xsltPointerListPtr extElemNamespaces; |
1460 | xsltEffectiveNsPtr effectiveNs; |
1461 | #ifdef XSLT_REFACTORED_XSLT_NSCOMP |
1462 | /* |
1463 | * Namespace name map to get rid of string comparison of namespace names. |
1464 | */ |
1465 | xsltNsMapPtr nsMap; |
1466 | #endif |
1467 | }; |
1468 | |
1469 | |
1470 | #endif |
1471 | /* |
1472 | * Note that we added a @compCtxt field to anchor an stylesheet compilation |
1473 | * context, since, due to historical reasons, various compile-time function |
1474 | * take only the stylesheet as argument and not a compilation context. |
1475 | */ |
1476 | struct _xsltStylesheet { |
1477 | /* |
1478 | * The stylesheet import relation is kept as a tree. |
1479 | */ |
1480 | struct _xsltStylesheet *parent; |
1481 | struct _xsltStylesheet *next; |
1482 | struct _xsltStylesheet *imports; |
1483 | |
1484 | xsltDocumentPtr docList; /* the include document list */ |
1485 | |
1486 | /* |
1487 | * General data on the style sheet document. |
1488 | */ |
1489 | xmlDocPtr doc; /* the parsed XML stylesheet */ |
1490 | xmlHashTablePtr stripSpaces;/* the hash table of the strip-space and |
1491 | preserve space elements */ |
1492 | int stripAll; /* strip-space * (1) preserve-space * (-1) */ |
1493 | xmlHashTablePtr cdataSection;/* the hash table of the cdata-section */ |
1494 | |
1495 | /* |
1496 | * Global variable or parameters. |
1497 | */ |
1498 | xsltStackElemPtr variables; /* linked list of param and variables */ |
1499 | |
1500 | /* |
1501 | * Template descriptions. |
1502 | */ |
1503 | xsltTemplatePtr templates; /* the ordered list of templates */ |
1504 | void *templatesHash; /* hash table or wherever compiled templates |
1505 | information is stored */ |
1506 | void *rootMatch; /* template based on / */ |
1507 | void *keyMatch; /* template based on key() */ |
1508 | void *elemMatch; /* template based on * */ |
1509 | void *attrMatch; /* template based on @* */ |
1510 | void *parentMatch; /* template based on .. */ |
1511 | void *textMatch; /* template based on text() */ |
1512 | void *piMatch; /* template based on processing-instruction() */ |
1513 | void *; /* template based on comment() */ |
1514 | |
1515 | /* |
1516 | * Namespace aliases. |
1517 | * NOTE: Not used in the refactored code. |
1518 | */ |
1519 | xmlHashTablePtr nsAliases; /* the namespace alias hash tables */ |
1520 | |
1521 | /* |
1522 | * Attribute sets. |
1523 | */ |
1524 | xmlHashTablePtr attributeSets;/* the attribute sets hash tables */ |
1525 | |
1526 | /* |
1527 | * Namespaces. |
1528 | * TODO: Eliminate this. |
1529 | */ |
1530 | xmlHashTablePtr nsHash; /* the set of namespaces in use: |
1531 | ATTENTION: This is used for |
1532 | execution of XPath expressions; unfortunately |
1533 | it restricts the stylesheet to have distinct |
1534 | prefixes. |
1535 | TODO: We need to get rid of this. |
1536 | */ |
1537 | void *nsDefs; /* ATTENTION TODO: This is currently used to store |
1538 | xsltExtDefPtr (in extensions.c) and |
1539 | *not* xmlNsPtr. |
1540 | */ |
1541 | |
1542 | /* |
1543 | * Key definitions. |
1544 | */ |
1545 | void *keys; /* key definitions */ |
1546 | |
1547 | /* |
1548 | * Output related stuff. |
1549 | */ |
1550 | xmlChar *method; /* the output method */ |
1551 | xmlChar *methodURI; /* associated namespace if any */ |
1552 | xmlChar *version; /* version string */ |
1553 | xmlChar *encoding; /* encoding string */ |
1554 | int omitXmlDeclaration; /* omit-xml-declaration = "yes" | "no" */ |
1555 | |
1556 | /* |
1557 | * Number formatting. |
1558 | */ |
1559 | xsltDecimalFormatPtr decimalFormat; |
1560 | int standalone; /* standalone = "yes" | "no" */ |
1561 | xmlChar *doctypePublic; /* doctype-public string */ |
1562 | xmlChar *doctypeSystem; /* doctype-system string */ |
1563 | int indent; /* should output being indented */ |
1564 | xmlChar *mediaType; /* media-type string */ |
1565 | |
1566 | /* |
1567 | * Precomputed blocks. |
1568 | */ |
1569 | xsltElemPreCompPtr preComps;/* list of precomputed blocks */ |
1570 | int warnings; /* number of warnings found at compilation */ |
1571 | int errors; /* number of errors found at compilation */ |
1572 | |
1573 | xmlChar *exclPrefix; /* last excluded prefixes */ |
1574 | xmlChar **exclPrefixTab; /* array of excluded prefixes */ |
1575 | int exclPrefixNr; /* number of excluded prefixes in scope */ |
1576 | int exclPrefixMax; /* size of the array */ |
1577 | |
1578 | void *_private; /* user defined data */ |
1579 | |
1580 | /* |
1581 | * Extensions. |
1582 | */ |
1583 | xmlHashTablePtr extInfos; /* the extension data */ |
1584 | int ; /* the number of extras required */ |
1585 | |
1586 | /* |
1587 | * For keeping track of nested includes |
1588 | */ |
1589 | xsltDocumentPtr includes; /* points to last nested include */ |
1590 | |
1591 | /* |
1592 | * dictionary: shared between stylesheet, context and documents. |
1593 | */ |
1594 | xmlDictPtr dict; |
1595 | /* |
1596 | * precompiled attribute value templates. |
1597 | */ |
1598 | void *attVTs; |
1599 | /* |
1600 | * if namespace-alias has an alias for the default stylesheet prefix |
1601 | * NOTE: Not used in the refactored code. |
1602 | */ |
1603 | const xmlChar *defaultAlias; |
1604 | /* |
1605 | * bypass pre-processing (already done) (used in imports) |
1606 | */ |
1607 | int nopreproc; |
1608 | /* |
1609 | * all document text strings were internalized |
1610 | */ |
1611 | int internalized; |
1612 | /* |
1613 | * Literal Result Element as Stylesheet c.f. section 2.3 |
1614 | */ |
1615 | int literal_result; |
1616 | /* |
1617 | * The principal stylesheet |
1618 | */ |
1619 | xsltStylesheetPtr principal; |
1620 | #ifdef XSLT_REFACTORED |
1621 | /* |
1622 | * Compilation context used during compile-time. |
1623 | */ |
1624 | xsltCompilerCtxtPtr compCtxt; /* TODO: Change this to (void *). */ |
1625 | |
1626 | xsltPrincipalStylesheetDataPtr principalData; |
1627 | #endif |
1628 | /* |
1629 | * Forwards-compatible processing |
1630 | */ |
1631 | int forwards_compatible; |
1632 | |
1633 | xmlHashTablePtr namedTemplates; /* hash table of named templates */ |
1634 | |
1635 | xmlXPathContextPtr xpathCtxt; |
1636 | }; |
1637 | |
1638 | typedef struct _xsltTransformCache xsltTransformCache; |
1639 | typedef xsltTransformCache *xsltTransformCachePtr; |
1640 | struct _xsltTransformCache { |
1641 | xmlDocPtr RVT; |
1642 | int nbRVT; |
1643 | xsltStackElemPtr stackItems; |
1644 | int nbStackItems; |
1645 | #ifdef XSLT_DEBUG_PROFILE_CACHE |
1646 | int dbgCachedRVTs; |
1647 | int dbgReusedRVTs; |
1648 | int dbgCachedVars; |
1649 | int dbgReusedVars; |
1650 | #endif |
1651 | }; |
1652 | |
1653 | /* |
1654 | * The in-memory structure corresponding to an XSLT Transformation. |
1655 | */ |
1656 | typedef enum { |
1657 | XSLT_OUTPUT_XML = 0, |
1658 | XSLT_OUTPUT_HTML, |
1659 | XSLT_OUTPUT_TEXT |
1660 | } xsltOutputType; |
1661 | |
1662 | typedef enum { |
1663 | XSLT_STATE_OK = 0, |
1664 | XSLT_STATE_ERROR, |
1665 | XSLT_STATE_STOPPED |
1666 | } xsltTransformState; |
1667 | |
1668 | struct _xsltTransformContext { |
1669 | xsltStylesheetPtr style; /* the stylesheet used */ |
1670 | xsltOutputType type; /* the type of output */ |
1671 | |
1672 | xsltTemplatePtr templ; /* the current template */ |
1673 | int templNr; /* Nb of templates in the stack */ |
1674 | int templMax; /* Size of the templtes stack */ |
1675 | xsltTemplatePtr *templTab; /* the template stack */ |
1676 | |
1677 | xsltStackElemPtr vars; /* the current variable list */ |
1678 | int varsNr; /* Nb of variable list in the stack */ |
1679 | int varsMax; /* Size of the variable list stack */ |
1680 | xsltStackElemPtr *varsTab; /* the variable list stack */ |
1681 | int varsBase; /* the var base for current templ */ |
1682 | |
1683 | /* |
1684 | * Extensions |
1685 | */ |
1686 | xmlHashTablePtr extFunctions; /* the extension functions */ |
1687 | xmlHashTablePtr extElements; /* the extension elements */ |
1688 | xmlHashTablePtr extInfos; /* the extension data */ |
1689 | |
1690 | const xmlChar *mode; /* the current mode */ |
1691 | const xmlChar *modeURI; /* the current mode URI */ |
1692 | |
1693 | xsltDocumentPtr docList; /* the document list */ |
1694 | |
1695 | xsltDocumentPtr document; /* the current source document; can be NULL if an RTF */ |
1696 | xmlNodePtr node; /* the current node being processed */ |
1697 | xmlNodeSetPtr nodeList; /* the current node list */ |
1698 | /* xmlNodePtr current; the node */ |
1699 | |
1700 | xmlDocPtr output; /* the resulting document */ |
1701 | xmlNodePtr insert; /* the insertion node */ |
1702 | |
1703 | xmlXPathContextPtr xpathCtxt; /* the XPath context */ |
1704 | xsltTransformState state; /* the current state */ |
1705 | |
1706 | /* |
1707 | * Global variables |
1708 | */ |
1709 | xmlHashTablePtr globalVars; /* the global variables and params */ |
1710 | |
1711 | xmlNodePtr inst; /* the instruction in the stylesheet */ |
1712 | |
1713 | int xinclude; /* should XInclude be processed */ |
1714 | |
1715 | const char * outputFile; /* the output URI if known */ |
1716 | |
1717 | int profile; /* is this run profiled */ |
1718 | long prof; /* the current profiled value */ |
1719 | int profNr; /* Nb of templates in the stack */ |
1720 | int profMax; /* Size of the templtaes stack */ |
1721 | long *profTab; /* the profile template stack */ |
1722 | |
1723 | void *_private; /* user defined data */ |
1724 | |
1725 | int ; /* the number of extras used */ |
1726 | int ; /* the number of extras allocated */ |
1727 | xsltRuntimeExtraPtr ; /* extra per runtime information */ |
1728 | |
1729 | xsltDocumentPtr styleList; /* the stylesheet docs list */ |
1730 | void * sec; /* the security preferences if any */ |
1731 | |
1732 | xmlGenericErrorFunc error; /* a specific error handler */ |
1733 | void * errctx; /* context for the error handler */ |
1734 | |
1735 | xsltSortFunc sortfunc; /* a ctxt specific sort routine */ |
1736 | |
1737 | /* |
1738 | * handling of temporary Result Value Tree |
1739 | * (XSLT 1.0 term: "Result Tree Fragment") |
1740 | */ |
1741 | xmlDocPtr tmpRVT; /* list of RVT without persistance */ |
1742 | xmlDocPtr persistRVT; /* list of persistant RVTs */ |
1743 | int ctxtflags; /* context processing flags */ |
1744 | |
1745 | /* |
1746 | * Speed optimization when coalescing text nodes |
1747 | */ |
1748 | const xmlChar *lasttext; /* last text node content */ |
1749 | int lasttsize; /* last text node size */ |
1750 | int lasttuse; /* last text node use */ |
1751 | /* |
1752 | * Per Context Debugging |
1753 | */ |
1754 | int debugStatus; /* the context level debug status */ |
1755 | unsigned long* traceCode; /* pointer to the variable holding the mask */ |
1756 | |
1757 | int parserOptions; /* parser options xmlParserOption */ |
1758 | |
1759 | /* |
1760 | * dictionary: shared between stylesheet, context and documents. |
1761 | */ |
1762 | xmlDictPtr dict; |
1763 | xmlDocPtr tmpDoc; /* Obsolete; not used in the library. */ |
1764 | /* |
1765 | * all document text strings are internalized |
1766 | */ |
1767 | int internalized; |
1768 | int nbKeys; |
1769 | int hasTemplKeyPatterns; |
1770 | xsltTemplatePtr currentTemplateRule; /* the Current Template Rule */ |
1771 | xmlNodePtr initialContextNode; |
1772 | xmlDocPtr initialContextDoc; |
1773 | xsltTransformCachePtr cache; |
1774 | void *contextVariable; /* the current variable item */ |
1775 | xmlDocPtr localRVT; /* list of local tree fragments; will be freed when |
1776 | the instruction which created the fragment |
1777 | exits */ |
1778 | xmlDocPtr localRVTBase; /* Obsolete */ |
1779 | int keyInitLevel; /* Needed to catch recursive keys issues */ |
1780 | int depth; /* Needed to catch recursions */ |
1781 | int maxTemplateDepth; |
1782 | int maxTemplateVars; |
1783 | unsigned long opLimit; |
1784 | unsigned long opCount; |
1785 | |
1786 | unsigned long nextid;/* for generating stable ids */ |
1787 | }; |
1788 | |
1789 | /** |
1790 | * CHECK_STOPPED: |
1791 | * |
1792 | * Macro to check if the XSLT processing should be stopped. |
1793 | * Will return from the function. |
1794 | */ |
1795 | #define CHECK_STOPPED if (ctxt->state == XSLT_STATE_STOPPED) return; |
1796 | |
1797 | /** |
1798 | * CHECK_STOPPEDE: |
1799 | * |
1800 | * Macro to check if the XSLT processing should be stopped. |
1801 | * Will goto the error: label. |
1802 | */ |
1803 | #define CHECK_STOPPEDE if (ctxt->state == XSLT_STATE_STOPPED) goto error; |
1804 | |
1805 | /** |
1806 | * CHECK_STOPPED0: |
1807 | * |
1808 | * Macro to check if the XSLT processing should be stopped. |
1809 | * Will return from the function with a 0 value. |
1810 | */ |
1811 | #define CHECK_STOPPED0 if (ctxt->state == XSLT_STATE_STOPPED) return(0); |
1812 | |
1813 | /* |
1814 | * The macro XML_CAST_FPTR is a hack to avoid a gcc warning about |
1815 | * possible incompatibilities between function pointers and object |
1816 | * pointers. It is defined in libxml/hash.h within recent versions |
1817 | * of libxml2, but is put here for compatibility. |
1818 | */ |
1819 | #ifndef XML_CAST_FPTR |
1820 | /** |
1821 | * XML_CAST_FPTR: |
1822 | * @fptr: pointer to a function |
1823 | * |
1824 | * Macro to do a casting from an object pointer to a |
1825 | * function pointer without encountering a warning from |
1826 | * gcc |
1827 | * |
1828 | * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr)) |
1829 | * This macro violated ISO C aliasing rules (gcc4 on s390 broke) |
1830 | * so it is disabled now |
1831 | */ |
1832 | |
1833 | #define XML_CAST_FPTR(fptr) fptr |
1834 | #endif |
1835 | /* |
1836 | * Functions associated to the internal types |
1837 | xsltDecimalFormatPtr xsltDecimalFormatGetByName(xsltStylesheetPtr sheet, |
1838 | xmlChar *name); |
1839 | */ |
1840 | XSLTPUBFUN xsltStylesheetPtr XSLTCALL |
1841 | xsltNewStylesheet (void); |
1842 | XSLTPUBFUN xsltStylesheetPtr XSLTCALL |
1843 | xsltParseStylesheetFile (const xmlChar* filename); |
1844 | XSLTPUBFUN void XSLTCALL |
1845 | xsltFreeStylesheet (xsltStylesheetPtr style); |
1846 | XSLTPUBFUN int XSLTCALL |
1847 | xsltIsBlank (xmlChar *str); |
1848 | XSLTPUBFUN void XSLTCALL |
1849 | xsltFreeStackElemList (xsltStackElemPtr elem); |
1850 | XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL |
1851 | xsltDecimalFormatGetByName(xsltStylesheetPtr style, |
1852 | xmlChar *name); |
1853 | XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL |
1854 | xsltDecimalFormatGetByQName(xsltStylesheetPtr style, |
1855 | const xmlChar *nsUri, |
1856 | const xmlChar *name); |
1857 | |
1858 | XSLTPUBFUN xsltStylesheetPtr XSLTCALL |
1859 | xsltParseStylesheetProcess(xsltStylesheetPtr ret, |
1860 | xmlDocPtr doc); |
1861 | XSLTPUBFUN void XSLTCALL |
1862 | xsltParseStylesheetOutput(xsltStylesheetPtr style, |
1863 | xmlNodePtr cur); |
1864 | XSLTPUBFUN xsltStylesheetPtr XSLTCALL |
1865 | xsltParseStylesheetDoc (xmlDocPtr doc); |
1866 | XSLTPUBFUN xsltStylesheetPtr XSLTCALL |
1867 | xsltParseStylesheetImportedDoc(xmlDocPtr doc, |
1868 | xsltStylesheetPtr style); |
1869 | XSLTPUBFUN int XSLTCALL |
1870 | xsltParseStylesheetUser(xsltStylesheetPtr style, |
1871 | xmlDocPtr doc); |
1872 | XSLTPUBFUN xsltStylesheetPtr XSLTCALL |
1873 | xsltLoadStylesheetPI (xmlDocPtr doc); |
1874 | XSLTPUBFUN void XSLTCALL |
1875 | xsltNumberFormat (xsltTransformContextPtr ctxt, |
1876 | xsltNumberDataPtr data, |
1877 | xmlNodePtr node); |
1878 | XSLTPUBFUN xmlXPathError XSLTCALL |
1879 | xsltFormatNumberConversion(xsltDecimalFormatPtr self, |
1880 | xmlChar *format, |
1881 | double number, |
1882 | xmlChar **result); |
1883 | |
1884 | XSLTPUBFUN void XSLTCALL |
1885 | xsltParseTemplateContent(xsltStylesheetPtr style, |
1886 | xmlNodePtr templ); |
1887 | XSLTPUBFUN int XSLTCALL |
1888 | (xsltStylesheetPtr style); |
1889 | XSLTPUBFUN int XSLTCALL |
1890 | (xsltTransformContextPtr ctxt); |
1891 | /* |
1892 | * Extra functions for Result Value Trees |
1893 | */ |
1894 | XSLTPUBFUN xmlDocPtr XSLTCALL |
1895 | xsltCreateRVT (xsltTransformContextPtr ctxt); |
1896 | XSLTPUBFUN int XSLTCALL |
1897 | xsltRegisterTmpRVT (xsltTransformContextPtr ctxt, |
1898 | xmlDocPtr RVT); |
1899 | XSLTPUBFUN int XSLTCALL |
1900 | xsltRegisterLocalRVT (xsltTransformContextPtr ctxt, |
1901 | xmlDocPtr RVT); |
1902 | XSLTPUBFUN int XSLTCALL |
1903 | xsltRegisterPersistRVT (xsltTransformContextPtr ctxt, |
1904 | xmlDocPtr RVT); |
1905 | XSLTPUBFUN int XSLTCALL |
1906 | xsltExtensionInstructionResultRegister( |
1907 | xsltTransformContextPtr ctxt, |
1908 | xmlXPathObjectPtr obj); |
1909 | XSLTPUBFUN int XSLTCALL |
1910 | xsltExtensionInstructionResultFinalize( |
1911 | xsltTransformContextPtr ctxt); |
1912 | XSLTPUBFUN int XSLTCALL |
1913 | xsltFlagRVTs( |
1914 | xsltTransformContextPtr ctxt, |
1915 | xmlXPathObjectPtr obj, |
1916 | void *val); |
1917 | XSLTPUBFUN void XSLTCALL |
1918 | xsltFreeRVTs (xsltTransformContextPtr ctxt); |
1919 | XSLTPUBFUN void XSLTCALL |
1920 | xsltReleaseRVT (xsltTransformContextPtr ctxt, |
1921 | xmlDocPtr RVT); |
1922 | /* |
1923 | * Extra functions for Attribute Value Templates |
1924 | */ |
1925 | XSLTPUBFUN void XSLTCALL |
1926 | xsltCompileAttr (xsltStylesheetPtr style, |
1927 | xmlAttrPtr attr); |
1928 | XSLTPUBFUN xmlChar * XSLTCALL |
1929 | xsltEvalAVT (xsltTransformContextPtr ctxt, |
1930 | void *avt, |
1931 | xmlNodePtr node); |
1932 | XSLTPUBFUN void XSLTCALL |
1933 | xsltFreeAVTList (void *avt); |
1934 | |
1935 | /* |
1936 | * Extra function for successful xsltCleanupGlobals / xsltInit sequence. |
1937 | */ |
1938 | |
1939 | XSLTPUBFUN void XSLTCALL |
1940 | xsltUninit (void); |
1941 | |
1942 | /************************************************************************ |
1943 | * * |
1944 | * Compile-time functions for *internal* use only * |
1945 | * * |
1946 | ************************************************************************/ |
1947 | |
1948 | #ifdef XSLT_REFACTORED |
1949 | XSLTPUBFUN void XSLTCALL |
1950 | xsltParseSequenceConstructor( |
1951 | xsltCompilerCtxtPtr cctxt, |
1952 | xmlNodePtr start); |
1953 | XSLTPUBFUN int XSLTCALL |
1954 | xsltParseAnyXSLTElem (xsltCompilerCtxtPtr cctxt, |
1955 | xmlNodePtr elem); |
1956 | #ifdef XSLT_REFACTORED_XSLT_NSCOMP |
1957 | XSLTPUBFUN int XSLTCALL |
1958 | xsltRestoreDocumentNamespaces( |
1959 | xsltNsMapPtr ns, |
1960 | xmlDocPtr doc); |
1961 | #endif |
1962 | #endif /* XSLT_REFACTORED */ |
1963 | |
1964 | /************************************************************************ |
1965 | * * |
1966 | * Transformation-time functions for *internal* use only * |
1967 | * * |
1968 | ************************************************************************/ |
1969 | XSLTPUBFUN int XSLTCALL |
1970 | xsltInitCtxtKey (xsltTransformContextPtr ctxt, |
1971 | xsltDocumentPtr doc, |
1972 | xsltKeyDefPtr keyd); |
1973 | XSLTPUBFUN int XSLTCALL |
1974 | xsltInitAllDocKeys (xsltTransformContextPtr ctxt); |
1975 | #ifdef __cplusplus |
1976 | } |
1977 | #endif |
1978 | |
1979 | #endif /* __XML_XSLT_H__ */ |
1980 | |
1981 | |