Home | History | Annotate | Download | only in libxslt
      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 
   1968