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