| Viewing file:  xsltInternals.h (56.26 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
/** Summary: internal data structures, constants and functions
 * Description: Internal data structures, constants and functions used
 *              by the XSLT engine.
 *              They are not part of the API or ABI, i.e. they can change
 *              without prior notice, use carefully.
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Daniel Veillard
 */
 
 #ifndef __XML_XSLT_INTERNALS_H__
 #define __XML_XSLT_INTERNALS_H__
 
 #include <libxml/tree.h>
 #include <libxml/hash.h>
 #include <libxml/xpath.h>
 #include <libxml/xmlerror.h>
 #include <libxml/dict.h>
 #include <libxml/xmlstring.h>
 #include <libxslt/xslt.h>
 #include "xsltexports.h"
 #include "xsltlocale.h"
 #include "numbersInternals.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* #define XSLT_DEBUG_PROFILE_CACHE */
 
 /**
 * XSLT_IS_TEXT_NODE:
 *
 * check if the argument is a text node
 */
 #define XSLT_IS_TEXT_NODE(n) ((n != NULL) && \
 (((n)->type == XML_TEXT_NODE) || \
 ((n)->type == XML_CDATA_SECTION_NODE)))
 
 
 /**
 * XSLT_MARK_RES_TREE_FRAG:
 *
 * internal macro to set up tree fragments
 */
 #define XSLT_MARK_RES_TREE_FRAG(n) \
 (n)->name = (char *) xmlStrdup(BAD_CAST " fake node libxslt");
 
 /**
 * XSLT_IS_RES_TREE_FRAG:
 *
 * internal macro to test tree fragments
 */
 #define XSLT_IS_RES_TREE_FRAG(n) \
 ((n != NULL) && ((n)->type == XML_DOCUMENT_NODE) && \
 ((n)->name != NULL) && ((n)->name[0] == ' '))
 
 /**
 * XSLT_REFACTORED_KEYCOMP:
 *
 * Internal define to enable on-demand xsl:key computation.
 * That's the only mode now but the define is kept for compatibility
 */
 #define XSLT_REFACTORED_KEYCOMP
 
 /**
 * XSLT_FAST_IF:
 *
 * Internal define to enable usage of xmlXPathCompiledEvalToBoolean()
 * for XSLT "tests"; e.g. in <xsl:if test="/foo/bar">
 */
 #define XSLT_FAST_IF
 
 /**
 * XSLT_REFACTORED:
 *
 * Internal define to enable the refactored parts of Libxslt.
 */
 /* #define XSLT_REFACTORED */
 /* ==================================================================== */
 
 /**
 * XSLT_REFACTORED_VARS:
 *
 * Internal define to enable the refactored variable part of libxslt
 */
 #define XSLT_REFACTORED_VARS
 
 #ifdef XSLT_REFACTORED
 
 extern const xmlChar *xsltXSLTAttrMarker;
 
 
 /* TODO: REMOVE: #define XSLT_REFACTORED_EXCLRESNS */
 
 /* TODO: REMOVE: #define XSLT_REFACTORED_NSALIAS */
 
 /**
 * XSLT_REFACTORED_XSLT_NSCOMP
 *
 * Internal define to enable the pointer-comparison of
 * namespaces of XSLT elements.
 */
 /* #define XSLT_REFACTORED_XSLT_NSCOMP */
 
 #ifdef XSLT_REFACTORED_XSLT_NSCOMP
 
 extern const xmlChar *xsltConstNamespaceNameXSLT;
 
 /**
 * IS_XSLT_ELEM_FAST:
 *
 * quick test to detect XSLT elements
 */
 #define IS_XSLT_ELEM_FAST(n) \
 (((n) != NULL) && ((n)->ns != NULL) && \
 ((n)->ns->href == xsltConstNamespaceNameXSLT))
 
 /**
 * IS_XSLT_ATTR_FAST:
 *
 * quick test to detect XSLT attributes
 */
 #define IS_XSLT_ATTR_FAST(a) \
 (((a) != NULL) && ((a)->ns != NULL) && \
 ((a)->ns->href == xsltConstNamespaceNameXSLT))
 
 /**
 * XSLT_HAS_INTERNAL_NSMAP:
 *
 * check for namespace mapping
 */
 #define XSLT_HAS_INTERNAL_NSMAP(s) \
 (((s) != NULL) && ((s)->principal) && \
 ((s)->principal->principalData) && \
 ((s)->principal->principalData->nsMap))
 
 /**
 * XSLT_GET_INTERNAL_NSMAP:
 *
 * get pointer to namespace map
 */
 #define XSLT_GET_INTERNAL_NSMAP(s) ((s)->principal->principalData->nsMap)
 
 #else /* XSLT_REFACTORED_XSLT_NSCOMP */
 
 /**
 * IS_XSLT_ELEM_FAST:
 *
 * quick check whether this is an xslt element
 */
 #define IS_XSLT_ELEM_FAST(n) \
 (((n) != NULL) && ((n)->ns != NULL) && \
 (xmlStrEqual((n)->ns->href, XSLT_NAMESPACE)))
 
 /**
 * IS_XSLT_ATTR_FAST:
 *
 * quick check for xslt namespace attribute
 */
 #define IS_XSLT_ATTR_FAST(a) \
 (((a) != NULL) && ((a)->ns != NULL) && \
 (xmlStrEqual((a)->ns->href, XSLT_NAMESPACE)))
 
 
 #endif /* XSLT_REFACTORED_XSLT_NSCOMP */
 
 
 /**
 * XSLT_REFACTORED_MANDATORY_VERSION:
 *
 * TODO: Currently disabled to surpress regression test failures, since
 *  the old behaviour was that a missing version attribute
 *  produced a only a warning and not an error, which was incerrect.
 *  So the regression tests need to be fixed if this is enabled.
 */
 /* #define XSLT_REFACTORED_MANDATORY_VERSION */
 
 /**
 * xsltPointerList:
 *
 * Pointer-list for various purposes.
 */
 typedef struct _xsltPointerList xsltPointerList;
 typedef xsltPointerList *xsltPointerListPtr;
 struct _xsltPointerList {
 void **items;
 int number;
 int size;
 };
 
 #endif
 
 /**
 * XSLT_REFACTORED_PARSING:
 *
 * Internal define to enable the refactored parts of Libxslt
 * related to parsing.
 */
 /* #define XSLT_REFACTORED_PARSING */
 
 /**
 * XSLT_MAX_SORT:
 *
 * Max number of specified xsl:sort on an element.
 */
 #define XSLT_MAX_SORT 15
 
 /**
 * XSLT_PAT_NO_PRIORITY:
 *
 * Specific value for pattern without priority expressed.
 */
 #define XSLT_PAT_NO_PRIORITY -12345789
 
 /**
 * xsltRuntimeExtra:
 *
 * Extra information added to the transformation context.
 */
 typedef struct _xsltRuntimeExtra xsltRuntimeExtra;
 typedef xsltRuntimeExtra *xsltRuntimeExtraPtr;
 struct _xsltRuntimeExtra {
 void       *info;        /* pointer to the extra data */
 xmlFreeFunc deallocate;    /* pointer to the deallocation routine */
 union {            /* dual-purpose field */
 void   *ptr;        /* data not needing deallocation */
 int    ival;        /* integer value storage */
 } val;
 };
 
 /**
 * XSLT_RUNTIME_EXTRA_LST:
 * @ctxt: the transformation context
 * @nr: the index
 *
 * Macro used to access extra information stored in the context
 */
 #define XSLT_RUNTIME_EXTRA_LST(ctxt, nr) (ctxt)->extras[(nr)].info
 /**
 * XSLT_RUNTIME_EXTRA_FREE:
 * @ctxt: the transformation context
 * @nr: the index
 *
 * Macro used to free extra information stored in the context
 */
 #define XSLT_RUNTIME_EXTRA_FREE(ctxt, nr) (ctxt)->extras[(nr)].deallocate
 /**
 * XSLT_RUNTIME_EXTRA:
 * @ctxt: the transformation context
 * @nr: the index
 *
 * Macro used to define extra information stored in the context
 */
 #define    XSLT_RUNTIME_EXTRA(ctxt, nr, typ) (ctxt)->extras[(nr)].val.typ
 
 /**
 * xsltTemplate:
 *
 * The in-memory structure corresponding to an XSLT Template.
 */
 typedef struct _xsltTemplate xsltTemplate;
 typedef xsltTemplate *xsltTemplatePtr;
 struct _xsltTemplate {
 struct _xsltTemplate *next;/* chained list sorted by priority */
 struct _xsltStylesheet *style;/* the containing stylesheet */
 xmlChar *match;    /* the matching string */
 float priority;    /* as given from the stylesheet, not computed */
 const xmlChar *name; /* the local part of the name QName */
 const xmlChar *nameURI; /* the URI part of the name QName */
 const xmlChar *mode;/* the local part of the mode QName */
 const xmlChar *modeURI;/* the URI part of the mode QName */
 xmlNodePtr content;    /* the template replacement value */
 xmlNodePtr elem;    /* the source element */
 
 /*
 * TODO: @inheritedNsNr and @inheritedNs won't be used in the
 *  refactored code.
 */
 int inheritedNsNr;  /* number of inherited namespaces */
 xmlNsPtr *inheritedNs;/* inherited non-excluded namespaces */
 
 /* Profiling information */
 int nbCalls;        /* the number of time the template was called */
 unsigned long time; /* the time spent in this template */
 void *params;       /* xsl:param instructions */
 
 int              templNr;        /* Nb of templates in the stack */
 int              templMax;        /* Size of the templtes stack */
 xsltTemplatePtr *templCalledTab;    /* templates called */
 int             *templCountTab;  /* .. and how often */
 
 /* Conflict resolution */
 int position;
 };
 
 /**
 * xsltDecimalFormat:
 *
 * Data structure of decimal-format.
 */
 typedef struct _xsltDecimalFormat xsltDecimalFormat;
 typedef xsltDecimalFormat *xsltDecimalFormatPtr;
 struct _xsltDecimalFormat {
 struct _xsltDecimalFormat *next; /* chained list */
 xmlChar *name;
 /* Used for interpretation of pattern */
 xmlChar *digit;
 xmlChar *patternSeparator;
 /* May appear in result */
 xmlChar *minusSign;
 xmlChar *infinity;
 xmlChar *noNumber; /* Not-a-number */
 /* Used for interpretation of pattern and may appear in result */
 xmlChar *decimalPoint;
 xmlChar *grouping;
 xmlChar *percent;
 xmlChar *permille;
 xmlChar *zeroDigit;
 const xmlChar *nsUri;
 };
 
 /**
 * xsltDocument:
 *
 * Data structure associated to a parsed document.
 */
 typedef struct _xsltDocument xsltDocument;
 typedef xsltDocument *xsltDocumentPtr;
 struct _xsltDocument {
 struct _xsltDocument *next;    /* documents are kept in a chained list */
 int main;            /* is this the main document */
 xmlDocPtr doc;        /* the parsed document */
 void *keys;            /* key tables storage */
 struct _xsltDocument *includes; /* subsidiary includes */
 int preproc;        /* pre-processing already done */
 int nbKeysComputed;
 };
 
 /**
 * xsltKeyDef:
 *
 * Representation of an xsl:key.
 */
 typedef struct _xsltKeyDef xsltKeyDef;
 typedef xsltKeyDef *xsltKeyDefPtr;
 struct _xsltKeyDef {
 struct _xsltKeyDef *next;
 xmlNodePtr inst;
 xmlChar *name;
 xmlChar *nameURI;
 xmlChar *match;
 xmlChar *use;
 xmlXPathCompExprPtr comp;
 xmlXPathCompExprPtr usecomp;
 xmlNsPtr *nsList;           /* the namespaces in scope */
 int nsNr;                   /* the number of namespaces in scope */
 };
 
 /**
 * xsltKeyTable:
 *
 * Holds the computed keys for key definitions of the same QName.
 * Is owned by an xsltDocument.
 */
 typedef struct _xsltKeyTable xsltKeyTable;
 typedef xsltKeyTable *xsltKeyTablePtr;
 struct _xsltKeyTable {
 struct _xsltKeyTable *next;
 xmlChar *name;
 xmlChar *nameURI;
 xmlHashTablePtr keys;
 };
 
 /*
 * The in-memory structure corresponding to an XSLT Stylesheet.
 * NOTE: most of the content is simply linked from the doc tree
 *       structure, no specific allocation is made.
 */
 typedef struct _xsltStylesheet xsltStylesheet;
 typedef xsltStylesheet *xsltStylesheetPtr;
 
 typedef struct _xsltTransformContext xsltTransformContext;
 typedef xsltTransformContext *xsltTransformContextPtr;
 
 /**
 * xsltElemPreComp:
 *
 * The in-memory structure corresponding to element precomputed data,
 * designed to be extended by extension implementors.
 */
 typedef struct _xsltElemPreComp xsltElemPreComp;
 typedef xsltElemPreComp *xsltElemPreCompPtr;
 
 /**
 * xsltTransformFunction:
 * @ctxt: the XSLT transformation context
 * @node: the input node
 * @inst: the stylesheet node
 * @comp: the compiled information from the stylesheet
 *
 * Signature of the function associated to elements part of the
 * stylesheet language like xsl:if or xsl:apply-templates.
 */
 typedef void (*xsltTransformFunction) (xsltTransformContextPtr ctxt,
 xmlNodePtr node,
 xmlNodePtr inst,
 xsltElemPreCompPtr comp);
 
 /**
 * xsltSortFunc:
 * @ctxt:    a transformation context
 * @sorts:   the node-set to sort
 * @nbsorts: the number of sorts
 *
 * Signature of the function to use during sorting
 */
 typedef void (*xsltSortFunc) (xsltTransformContextPtr ctxt, xmlNodePtr *sorts,
 int nbsorts);
 
 typedef enum {
 XSLT_FUNC_COPY=1,
 XSLT_FUNC_SORT,
 XSLT_FUNC_TEXT,
 XSLT_FUNC_ELEMENT,
 XSLT_FUNC_ATTRIBUTE,
 XSLT_FUNC_COMMENT,
 XSLT_FUNC_PI,
 XSLT_FUNC_COPYOF,
 XSLT_FUNC_VALUEOF,
 XSLT_FUNC_NUMBER,
 XSLT_FUNC_APPLYIMPORTS,
 XSLT_FUNC_CALLTEMPLATE,
 XSLT_FUNC_APPLYTEMPLATES,
 XSLT_FUNC_CHOOSE,
 XSLT_FUNC_IF,
 XSLT_FUNC_FOREACH,
 XSLT_FUNC_DOCUMENT,
 XSLT_FUNC_WITHPARAM,
 XSLT_FUNC_PARAM,
 XSLT_FUNC_VARIABLE,
 XSLT_FUNC_WHEN,
 XSLT_FUNC_EXTENSION
 #ifdef XSLT_REFACTORED
 ,
 XSLT_FUNC_OTHERWISE,
 XSLT_FUNC_FALLBACK,
 XSLT_FUNC_MESSAGE,
 XSLT_FUNC_INCLUDE,
 XSLT_FUNC_ATTRSET,
 XSLT_FUNC_LITERAL_RESULT_ELEMENT,
 XSLT_FUNC_UNKOWN_FORWARDS_COMPAT
 #endif
 } xsltStyleType;
 
 /**
 * xsltElemPreCompDeallocator:
 * @comp:  the #xsltElemPreComp to free up
 *
 * Deallocates an #xsltElemPreComp structure.
 */
 typedef void (*xsltElemPreCompDeallocator) (xsltElemPreCompPtr comp);
 
 /**
 * xsltElemPreComp:
 *
 * The basic structure for compiled items of the AST of the XSLT processor.
 * This structure is also intended to be extended by extension implementors.
 * TODO: This is somehow not nice, since it has a "free" field, which
 *   derived stylesheet-structs do not have.
 */
 struct _xsltElemPreComp {
 xsltElemPreCompPtr next;        /* next item in the global chained
 list held by xsltStylesheet. */
 xsltStyleType type;        /* type of the element */
 xsltTransformFunction func;    /* handling function */
 xmlNodePtr inst;            /* the node in the stylesheet's tree
 corresponding to this item */
 
 /* end of common part */
 xsltElemPreCompDeallocator free;    /* the deallocator */
 };
 
 /**
 * xsltStylePreComp:
 *
 * The abstract basic structure for items of the XSLT processor.
 * This includes:
 * 1) compiled forms of XSLT instructions (xsl:if, xsl:attribute, etc.)
 * 2) compiled forms of literal result elements
 * 3) compiled forms of extension elements
 */
 typedef struct _xsltStylePreComp xsltStylePreComp;
 typedef xsltStylePreComp *xsltStylePreCompPtr;
 
 #ifdef XSLT_REFACTORED
 
 /*
 * Some pointer-list utility functions.
 */
 XSLTPUBFUN xsltPointerListPtr XSLTCALL
 xsltPointerListCreate        (int initialSize);
 XSLTPUBFUN void XSLTCALL
 xsltPointerListFree        (xsltPointerListPtr list);
 XSLTPUBFUN void XSLTCALL
 xsltPointerListClear        (xsltPointerListPtr list);
 XSLTPUBFUN int XSLTCALL
 xsltPointerListAddSize        (xsltPointerListPtr list,
 void *item,
 int initialSize);
 
 /************************************************************************
 *                                    *
 * Refactored structures                                                *
 *                                    *
 ************************************************************************/
 
 typedef struct _xsltNsListContainer xsltNsListContainer;
 typedef xsltNsListContainer *xsltNsListContainerPtr;
 struct _xsltNsListContainer {
 xmlNsPtr *list;
 int totalNumber;
 int xpathNumber;
 };
 
 /**
 * XSLT_ITEM_COMPATIBILITY_FIELDS:
 *
 * Fields for API compatibility to the structure
 * _xsltElemPreComp which is used for extension functions.
 * Note that @next is used for storage; it does not reflect a next
 * sibling in the tree.
 * TODO: Evaluate if we really need such a compatibility.
 */
 #define XSLT_ITEM_COMPATIBILITY_FIELDS \
 xsltElemPreCompPtr next;\
 xsltStyleType type;\
 xsltTransformFunction func;\
 xmlNodePtr inst;
 
 /**
 * XSLT_ITEM_NAVIGATION_FIELDS:
 *
 * Currently empty.
 * TODO: It is intended to hold navigational fields in the future.
 */
 #define XSLT_ITEM_NAVIGATION_FIELDS
 /*
 xsltStylePreCompPtr parent;\
 xsltStylePreCompPtr children;\
 xsltStylePreCompPtr nextItem;
 */
 
 /**
 * XSLT_ITEM_NSINSCOPE_FIELDS:
 *
 * The in-scope namespaces.
 */
 #define XSLT_ITEM_NSINSCOPE_FIELDS xsltNsListContainerPtr inScopeNs;
 
 /**
 * XSLT_ITEM_COMMON_FIELDS:
 *
 * Common fields used for all items.
 */
 #define XSLT_ITEM_COMMON_FIELDS \
 XSLT_ITEM_COMPATIBILITY_FIELDS \
 XSLT_ITEM_NAVIGATION_FIELDS \
 XSLT_ITEM_NSINSCOPE_FIELDS
 
 /**
 * _xsltStylePreComp:
 *
 * The abstract basic structure for items of the XSLT processor.
 * This includes:
 * 1) compiled forms of XSLT instructions (e.g. xsl:if, xsl:attribute, etc.)
 * 2) compiled forms of literal result elements
 * 3) various properties for XSLT instructions (e.g. xsl:when,
 *    xsl:with-param)
 *
 * REVISIT TODO: Keep this structure equal to the fields
 *   defined by XSLT_ITEM_COMMON_FIELDS
 */
 struct _xsltStylePreComp {
 xsltElemPreCompPtr next;    /* next item in the global chained
 list held by xsltStylesheet */
 xsltStyleType type;         /* type of the item */
 xsltTransformFunction func; /* handling function */
 xmlNodePtr inst;        /* the node in the stylesheet's tree
 corresponding to this item. */
 /* Currently no navigational fields. */
 xsltNsListContainerPtr inScopeNs;
 };
 
 /**
 * xsltStyleBasicEmptyItem:
 *
 * Abstract structure only used as a short-cut for
 * XSLT items with no extra fields.
 * NOTE that it is intended that this structure looks the same as
 *  _xsltStylePreComp.
 */
 typedef struct _xsltStyleBasicEmptyItem xsltStyleBasicEmptyItem;
 typedef xsltStyleBasicEmptyItem *xsltStyleBasicEmptyItemPtr;
 
 struct _xsltStyleBasicEmptyItem {
 XSLT_ITEM_COMMON_FIELDS
 };
 
 /**
 * xsltStyleBasicExpressionItem:
 *
 * Abstract structure only used as a short-cut for
 * XSLT items with just an expression.
 */
 typedef struct _xsltStyleBasicExpressionItem xsltStyleBasicExpressionItem;
 typedef xsltStyleBasicExpressionItem *xsltStyleBasicExpressionItemPtr;
 
 struct _xsltStyleBasicExpressionItem {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *select; /* TODO: Change this to "expression". */
 xmlXPathCompExprPtr comp; /* TODO: Change this to compExpr. */
 };
 
 /************************************************************************
 *                                    *
 * XSLT-instructions/declarations                                       *
 *                                    *
 ************************************************************************/
 
 /**
 * xsltStyleItemElement:
 *
 * <!-- Category: instruction -->
 * <xsl:element
 *  name = { qname }
 *  namespace = { uri-reference }
 *  use-attribute-sets = qnames>
 *  <!-- Content: template -->
 * </xsl:element>
 */
 typedef struct _xsltStyleItemElement xsltStyleItemElement;
 typedef xsltStyleItemElement *xsltStyleItemElementPtr;
 
 struct _xsltStyleItemElement {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *use;
 int      has_use;
 const xmlChar *name;
 int      has_name;
 const xmlChar *ns;
 const xmlChar *nsPrefix;
 int      has_ns;
 };
 
 /**
 * xsltStyleItemAttribute:
 *
 * <!-- Category: instruction -->
 * <xsl:attribute
 *  name = { qname }
 *  namespace = { uri-reference }>
 *  <!-- Content: template -->
 * </xsl:attribute>
 */
 typedef struct _xsltStyleItemAttribute xsltStyleItemAttribute;
 typedef xsltStyleItemAttribute *xsltStyleItemAttributePtr;
 
 struct _xsltStyleItemAttribute {
 XSLT_ITEM_COMMON_FIELDS
 const xmlChar *name;
 int      has_name;
 const xmlChar *ns;
 const xmlChar *nsPrefix;
 int      has_ns;
 };
 
 /**
 * xsltStyleItemText:
 *
 * <!-- Category: instruction -->
 * <xsl:text
 *  disable-output-escaping = "yes" | "no">
 *  <!-- Content: #PCDATA -->
 * </xsl:text>
 */
 typedef struct _xsltStyleItemText xsltStyleItemText;
 typedef xsltStyleItemText *xsltStyleItemTextPtr;
 
 struct _xsltStyleItemText {
 XSLT_ITEM_COMMON_FIELDS
 int      noescape;        /* text */
 };
 
 /**
 * xsltStyleItemComment:
 *
 * <!-- Category: instruction -->
 *  <xsl:comment>
 *  <!-- Content: template -->
 * </xsl:comment>
 */
 typedef xsltStyleBasicEmptyItem xsltStyleItemComment;
 typedef xsltStyleItemComment *xsltStyleItemCommentPtr;
 
 /**
 * xsltStyleItemPI:
 *
 * <!-- Category: instruction -->
 *  <xsl:processing-instruction
 *  name = { ncname }>
 *  <!-- Content: template -->
 * </xsl:processing-instruction>
 */
 typedef struct _xsltStyleItemPI xsltStyleItemPI;
 typedef xsltStyleItemPI *xsltStyleItemPIPtr;
 
 struct _xsltStyleItemPI {
 XSLT_ITEM_COMMON_FIELDS
 const xmlChar *name;
 int      has_name;
 };
 
 /**
 * xsltStyleItemApplyImports:
 *
 * <!-- Category: instruction -->
 * <xsl:apply-imports />
 */
 typedef xsltStyleBasicEmptyItem xsltStyleItemApplyImports;
 typedef xsltStyleItemApplyImports *xsltStyleItemApplyImportsPtr;
 
 /**
 * xsltStyleItemApplyTemplates:
 *
 * <!-- Category: instruction -->
 *  <xsl:apply-templates
 *  select = node-set-expression
 *  mode = qname>
 *  <!-- Content: (xsl:sort | xsl:with-param)* -->
 * </xsl:apply-templates>
 */
 typedef struct _xsltStyleItemApplyTemplates xsltStyleItemApplyTemplates;
 typedef xsltStyleItemApplyTemplates *xsltStyleItemApplyTemplatesPtr;
 
 struct _xsltStyleItemApplyTemplates {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *mode;    /* apply-templates */
 const xmlChar *modeURI;    /* apply-templates */
 const xmlChar *select;    /* sort, copy-of, value-of, apply-templates */
 xmlXPathCompExprPtr comp;    /* a precompiled XPath expression */
 /* TODO: with-params */
 };
 
 /**
 * xsltStyleItemCallTemplate:
 *
 * <!-- Category: instruction -->
 *  <xsl:call-template
 *  name = qname>
 *  <!-- Content: xsl:with-param* -->
 * </xsl:call-template>
 */
 typedef struct _xsltStyleItemCallTemplate xsltStyleItemCallTemplate;
 typedef xsltStyleItemCallTemplate *xsltStyleItemCallTemplatePtr;
 
 struct _xsltStyleItemCallTemplate {
 XSLT_ITEM_COMMON_FIELDS
 
 xsltTemplatePtr templ;    /* call-template */
 const xmlChar *name;    /* element, attribute, pi */
 int      has_name;        /* element, attribute, pi */
 const xmlChar *ns;        /* element */
 int      has_ns;        /* element */
 /* TODO: with-params */
 };
 
 /**
 * xsltStyleItemCopy:
 *
 * <!-- Category: instruction -->
 * <xsl:copy
 *  use-attribute-sets = qnames>
 *  <!-- Content: template -->
 * </xsl:copy>
 */
 typedef struct _xsltStyleItemCopy xsltStyleItemCopy;
 typedef xsltStyleItemCopy *xsltStyleItemCopyPtr;
 
 struct _xsltStyleItemCopy {
 XSLT_ITEM_COMMON_FIELDS
 const xmlChar *use;        /* copy, element */
 int      has_use;        /* copy, element */
 };
 
 /**
 * xsltStyleItemIf:
 *
 * <!-- Category: instruction -->
 *  <xsl:if
 *  test = boolean-expression>
 *  <!-- Content: template -->
 * </xsl:if>
 */
 typedef struct _xsltStyleItemIf xsltStyleItemIf;
 typedef xsltStyleItemIf *xsltStyleItemIfPtr;
 
 struct _xsltStyleItemIf {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *test;    /* if */
 xmlXPathCompExprPtr comp;    /* a precompiled XPath expression */
 };
 
 
 /**
 * xsltStyleItemCopyOf:
 *
 * <!-- Category: instruction -->
 * <xsl:copy-of
 *  select = expression />
 */
 typedef xsltStyleBasicExpressionItem xsltStyleItemCopyOf;
 typedef xsltStyleItemCopyOf *xsltStyleItemCopyOfPtr;
 
 /**
 * xsltStyleItemValueOf:
 *
 * <!-- Category: instruction -->
 * <xsl:value-of
 *  select = string-expression
 *  disable-output-escaping = "yes" | "no" />
 */
 typedef struct _xsltStyleItemValueOf xsltStyleItemValueOf;
 typedef xsltStyleItemValueOf *xsltStyleItemValueOfPtr;
 
 struct _xsltStyleItemValueOf {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *select;
 xmlXPathCompExprPtr comp;    /* a precompiled XPath expression */
 int      noescape;
 };
 
 /**
 * xsltStyleItemNumber:
 *
 * <!-- Category: instruction -->
 *  <xsl:number
 *  level = "single" | "multiple" | "any"
 *  count = pattern
 *  from = pattern
 *  value = number-expression
 *  format = { string }
 *  lang = { nmtoken }
 *  letter-value = { "alphabetic" | "traditional" }
 *  grouping-separator = { char }
 *  grouping-size = { number } />
 */
 typedef struct _xsltStyleItemNumber xsltStyleItemNumber;
 typedef xsltStyleItemNumber *xsltStyleItemNumberPtr;
 
 struct _xsltStyleItemNumber {
 XSLT_ITEM_COMMON_FIELDS
 xsltNumberData numdata;    /* number */
 };
 
 /**
 * xsltStyleItemChoose:
 *
 * <!-- Category: instruction -->
 *  <xsl:choose>
 *  <!-- Content: (xsl:when+, xsl:otherwise?) -->
 * </xsl:choose>
 */
 typedef xsltStyleBasicEmptyItem xsltStyleItemChoose;
 typedef xsltStyleItemChoose *xsltStyleItemChoosePtr;
 
 /**
 * xsltStyleItemFallback:
 *
 * <!-- Category: instruction -->
 *  <xsl:fallback>
 *  <!-- Content: template -->
 * </xsl:fallback>
 */
 typedef xsltStyleBasicEmptyItem xsltStyleItemFallback;
 typedef xsltStyleItemFallback *xsltStyleItemFallbackPtr;
 
 /**
 * xsltStyleItemForEach:
 *
 * <!-- Category: instruction -->
 * <xsl:for-each
 *   select = node-set-expression>
 *   <!-- Content: (xsl:sort*, template) -->
 * </xsl:for-each>
 */
 typedef xsltStyleBasicExpressionItem xsltStyleItemForEach;
 typedef xsltStyleItemForEach *xsltStyleItemForEachPtr;
 
 /**
 * xsltStyleItemMessage:
 *
 * <!-- Category: instruction -->
 * <xsl:message
 *   terminate = "yes" | "no">
 *   <!-- Content: template -->
 * </xsl:message>
 */
 typedef struct _xsltStyleItemMessage xsltStyleItemMessage;
 typedef xsltStyleItemMessage *xsltStyleItemMessagePtr;
 
 struct _xsltStyleItemMessage {
 XSLT_ITEM_COMMON_FIELDS
 int terminate;
 };
 
 /**
 * xsltStyleItemDocument:
 *
 * NOTE: This is not an instruction of XSLT 1.0.
 */
 typedef struct _xsltStyleItemDocument xsltStyleItemDocument;
 typedef xsltStyleItemDocument *xsltStyleItemDocumentPtr;
 
 struct _xsltStyleItemDocument {
 XSLT_ITEM_COMMON_FIELDS
 int      ver11;        /* assigned: in xsltDocumentComp;
 read: nowhere;
 TODO: Check if we need. */
 const xmlChar *filename;    /* document URL */
 int has_filename;
 };
 
 /************************************************************************
 *                                    *
 * Non-instructions (actually properties of instructions/declarations)  *
 *                                    *
 ************************************************************************/
 
 /**
 * xsltStyleBasicItemVariable:
 *
 * Basic struct for xsl:variable, xsl:param and xsl:with-param.
 * It's currently important to have equal fields, since
 * xsltParseStylesheetCallerParam() is used with xsl:with-param from
 * the xslt side and with xsl:param from the exslt side (in
 * exsltFuncFunctionFunction()).
 *
 * FUTURE NOTE: In XSLT 2.0 xsl:param, xsl:variable and xsl:with-param
 *   have additional different fields.
 */
 typedef struct _xsltStyleBasicItemVariable xsltStyleBasicItemVariable;
 typedef xsltStyleBasicItemVariable *xsltStyleBasicItemVariablePtr;
 
 struct _xsltStyleBasicItemVariable {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *select;
 xmlXPathCompExprPtr comp;
 
 const xmlChar *name;
 int      has_name;
 const xmlChar *ns;
 int      has_ns;
 };
 
 /**
 * xsltStyleItemVariable:
 *
 * <!-- Category: top-level-element -->
 * <xsl:param
 *   name = qname
 *   select = expression>
 *   <!-- Content: template -->
 * </xsl:param>
 */
 typedef xsltStyleBasicItemVariable xsltStyleItemVariable;
 typedef xsltStyleItemVariable *xsltStyleItemVariablePtr;
 
 /**
 * xsltStyleItemParam:
 *
 * <!-- Category: top-level-element -->
 * <xsl:param
 *   name = qname
 *   select = expression>
 *   <!-- Content: template -->
 * </xsl:param>
 */
 typedef struct _xsltStyleItemParam xsltStyleItemParam;
 typedef xsltStyleItemParam *xsltStyleItemParamPtr;
 
 struct _xsltStyleItemParam {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *select;
 xmlXPathCompExprPtr comp;
 
 const xmlChar *name;
 int      has_name;
 const xmlChar *ns;
 int      has_ns;
 };
 
 /**
 * xsltStyleItemWithParam:
 *
 * <xsl:with-param
 *  name = qname
 *  select = expression>
 *  <!-- Content: template -->
 * </xsl:with-param>
 */
 typedef xsltStyleBasicItemVariable xsltStyleItemWithParam;
 typedef xsltStyleItemWithParam *xsltStyleItemWithParamPtr;
 
 /**
 * xsltStyleItemSort:
 *
 * Reflects the XSLT xsl:sort item.
 * Allowed parents: xsl:apply-templates, xsl:for-each
 * <xsl:sort
 *   select = string-expression
 *   lang = { nmtoken }
 *   data-type = { "text" | "number" | qname-but-not-ncname }
 *   order = { "ascending" | "descending" }
 *   case-order = { "upper-first" | "lower-first" } />
 */
 typedef struct _xsltStyleItemSort xsltStyleItemSort;
 typedef xsltStyleItemSort *xsltStyleItemSortPtr;
 
 struct _xsltStyleItemSort {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *stype;       /* sort */
 int      has_stype;        /* sort */
 int      number;        /* sort */
 const xmlChar *order;    /* sort */
 int      has_order;        /* sort */
 int      descending;    /* sort */
 const xmlChar *lang;    /* sort */
 int      has_lang;        /* sort */
 xsltLocale locale;        /* sort */
 const xmlChar *case_order;    /* sort */
 int      lower_first;    /* sort */
 
 const xmlChar *use;
 int      has_use;
 
 const xmlChar *select;    /* sort, copy-of, value-of, apply-templates */
 
 xmlXPathCompExprPtr comp;    /* a precompiled XPath expression */
 };
 
 
 /**
 * xsltStyleItemWhen:
 *
 * <xsl:when
 *   test = boolean-expression>
 *   <!-- Content: template -->
 * </xsl:when>
 * Allowed parent: xsl:choose
 */
 typedef struct _xsltStyleItemWhen xsltStyleItemWhen;
 typedef xsltStyleItemWhen *xsltStyleItemWhenPtr;
 
 struct _xsltStyleItemWhen {
 XSLT_ITEM_COMMON_FIELDS
 
 const xmlChar *test;
 xmlXPathCompExprPtr comp;
 };
 
 /**
 * xsltStyleItemOtherwise:
 *
 * Allowed parent: xsl:choose
 * <xsl:otherwise>
 *   <!-- Content: template -->
 * </xsl:otherwise>
 */
 typedef struct _xsltStyleItemOtherwise xsltStyleItemOtherwise;
 typedef xsltStyleItemOtherwise *xsltStyleItemOtherwisePtr;
 
 struct _xsltStyleItemOtherwise {
 XSLT_ITEM_COMMON_FIELDS
 };
 
 typedef struct _xsltStyleItemInclude xsltStyleItemInclude;
 typedef xsltStyleItemInclude *xsltStyleItemIncludePtr;
 
 struct _xsltStyleItemInclude {
 XSLT_ITEM_COMMON_FIELDS
 xsltDocumentPtr include;
 };
 
 /************************************************************************
 *                                    *
 *  XSLT elements in forwards-compatible mode                           *
 *                                    *
 ************************************************************************/
 
 typedef struct _xsltStyleItemUknown xsltStyleItemUknown;
 typedef xsltStyleItemUknown *xsltStyleItemUknownPtr;
 struct _xsltStyleItemUknown {
 XSLT_ITEM_COMMON_FIELDS
 };
 
 
 /************************************************************************
 *                                    *
 *  Extension elements                                                  *
 *                                    *
 ************************************************************************/
 
 /*
 * xsltStyleItemExtElement:
 *
 * Reflects extension elements.
 *
 * NOTE: Due to the fact that the structure xsltElemPreComp is most
 * probably already heavily in use out there by users, so we cannot
 * easily change it, we'll create an intermediate structure which will
 * hold an xsltElemPreCompPtr.
 * BIG NOTE: The only problem I see here is that the user processes the
 *  content of the stylesheet tree, possibly he'll lookup the node->psvi
 *  fields in order to find subsequent extension functions.
 *  In this case, the user's code will break, since the node->psvi
 *  field will hold now the xsltStyleItemExtElementPtr and not
 *  the xsltElemPreCompPtr.
 *  However the place where the structure is anchored in the node-tree,
 *  namely node->psvi, has beed already once been moved from node->_private
 *  to node->psvi, so we have a precedent here, which, I think, should allow
 *  us to change such semantics without headaches.
 */
 typedef struct _xsltStyleItemExtElement xsltStyleItemExtElement;
 typedef xsltStyleItemExtElement *xsltStyleItemExtElementPtr;
 struct _xsltStyleItemExtElement {
 XSLT_ITEM_COMMON_FIELDS
 xsltElemPreCompPtr item;
 };
 
 /************************************************************************
 *                                    *
 *  Literal result elements                                             *
 *                                    *
 ************************************************************************/
 
 typedef struct _xsltEffectiveNs xsltEffectiveNs;
 typedef xsltEffectiveNs *xsltEffectiveNsPtr;
 struct _xsltEffectiveNs {
 xsltEffectiveNsPtr nextInStore; /* storage next */
 xsltEffectiveNsPtr next; /* next item in the list */
 const xmlChar *prefix;
 const xmlChar *nsName;
 /*
 * Indicates if eclared on the literal result element; dunno if really
 * needed.
 */
 int holdByElem;
 };
 
 /*
 * Info for literal result elements.
 * This will be set on the elem->psvi field and will be
 * shared by literal result elements, which have the same
 * excluded result namespaces; i.e., this *won't* be created uniquely
 * for every literal result element.
 */
 typedef struct _xsltStyleItemLRElementInfo xsltStyleItemLRElementInfo;
 typedef xsltStyleItemLRElementInfo *xsltStyleItemLRElementInfoPtr;
 struct _xsltStyleItemLRElementInfo {
 XSLT_ITEM_COMMON_FIELDS
 /*
 * @effectiveNs is the set of effective ns-nodes
 *  on the literal result element, which will be added to the result
 *  element if not already existing in the result tree.
 *  This means that excluded namespaces (via exclude-result-prefixes,
 *  extension-element-prefixes and the XSLT namespace) not added
 *  to the set.
 *  Namespace-aliasing was applied on the @effectiveNs.
 */
 xsltEffectiveNsPtr effectiveNs;
 
 };
 
 #ifdef XSLT_REFACTORED
 
 typedef struct _xsltNsAlias xsltNsAlias;
 typedef xsltNsAlias *xsltNsAliasPtr;
 struct _xsltNsAlias {
 xsltNsAliasPtr next; /* next in the list */
 xmlNsPtr literalNs;
 xmlNsPtr targetNs;
 xmlDocPtr docOfTargetNs;
 };
 #endif
 
 #ifdef XSLT_REFACTORED_XSLT_NSCOMP
 
 typedef struct _xsltNsMap xsltNsMap;
 typedef xsltNsMap *xsltNsMapPtr;
 struct _xsltNsMap {
 xsltNsMapPtr next; /* next in the list */
 xmlDocPtr doc;
 xmlNodePtr elem; /* the element holding the ns-decl */
 xmlNsPtr ns; /* the xmlNs structure holding the XML namespace name */
 const xmlChar *origNsName; /* the original XML namespace name */
 const xmlChar *newNsName; /* the mapped XML namespace name */
 };
 #endif
 
 /************************************************************************
 *                                    *
 *  Compile-time structures for *internal* use only                     *
 *                                    *
 ************************************************************************/
 
 typedef struct _xsltPrincipalStylesheetData xsltPrincipalStylesheetData;
 typedef xsltPrincipalStylesheetData *xsltPrincipalStylesheetDataPtr;
 
 typedef struct _xsltNsList xsltNsList;
 typedef xsltNsList *xsltNsListPtr;
 struct _xsltNsList {
 xsltNsListPtr next; /* next in the list */
 xmlNsPtr ns;
 };
 
 /*
 * xsltVarInfo:
 *
 * Used at compilation time for parameters and variables.
 */
 typedef struct _xsltVarInfo xsltVarInfo;
 typedef xsltVarInfo *xsltVarInfoPtr;
 struct _xsltVarInfo {
 xsltVarInfoPtr next; /* next in the list */
 xsltVarInfoPtr prev;
 int depth; /* the depth in the tree */
 const xmlChar *name;
 const xmlChar *nsName;
 };
 
 /**
 * xsltCompilerNodeInfo:
 *
 * Per-node information during compile-time.
 */
 typedef struct _xsltCompilerNodeInfo xsltCompilerNodeInfo;
 typedef xsltCompilerNodeInfo *xsltCompilerNodeInfoPtr;
 struct _xsltCompilerNodeInfo {
 xsltCompilerNodeInfoPtr next;
 xsltCompilerNodeInfoPtr prev;
 xmlNodePtr node;
 int depth;
 xsltTemplatePtr templ;   /* The owning template */
 int category;         /* XSLT element, LR-element or
 extension element */
 xsltStyleType type;
 xsltElemPreCompPtr item; /* The compiled information */
 /* The current in-scope namespaces */
 xsltNsListContainerPtr inScopeNs;
 /* The current excluded result namespaces */
 xsltPointerListPtr exclResultNs;
 /* The current extension instruction namespaces */
 xsltPointerListPtr extElemNs;
 
 /* The current info for literal result elements. */
 xsltStyleItemLRElementInfoPtr litResElemInfo;
 /*
 * Set to 1 if in-scope namespaces changed,
 *  or excluded result namespaces changed,
 *  or extension element namespaces changed.
 * This will trigger creation of new infos
 *  for literal result elements.
 */
 int nsChanged;
 int preserveWhitespace;
 int stripWhitespace;
 int isRoot; /* whether this is the stylesheet's root node */
 int forwardsCompat; /* whether forwards-compatible mode is enabled */
 /* whether the content of an extension element was processed */
 int extContentHandled;
 /* the type of the current child */
 xsltStyleType curChildType;
 };
 
 /**
 * XSLT_CCTXT:
 *
 * get pointer to compiler context
 */
 #define XSLT_CCTXT(style) ((xsltCompilerCtxtPtr) style->compCtxt)
 
 typedef enum {
 XSLT_ERROR_SEVERITY_ERROR = 0,
 XSLT_ERROR_SEVERITY_WARNING
 } xsltErrorSeverityType;
 
 typedef struct _xsltCompilerCtxt xsltCompilerCtxt;
 typedef xsltCompilerCtxt *xsltCompilerCtxtPtr;
 struct _xsltCompilerCtxt {
 void *errorCtxt;            /* user specific error context */
 /*
 * used for error/warning reports; e.g. XSLT_ERROR_SEVERITY_WARNING */
 xsltErrorSeverityType errSeverity;
 int warnings;        /* TODO: number of warnings found at
 compilation */
 int errors;            /* TODO: number of errors found at
 compilation */
 xmlDictPtr dict;
 xsltStylesheetPtr style;
 int simplified; /* whether this is a simplified stylesheet */
 /* TODO: structured/unstructured error contexts. */
 int depth; /* Current depth of processing */
 
 xsltCompilerNodeInfoPtr inode;
 xsltCompilerNodeInfoPtr inodeList;
 xsltCompilerNodeInfoPtr inodeLast;
 xsltPointerListPtr tmpList; /* Used for various purposes */
 /*
 * The XSLT version as specified by the stylesheet's root element.
 */
 int isInclude;
 int hasForwardsCompat; /* whether forwards-compatible mode was used
 in a parsing episode */
 int maxNodeInfos; /* TEMP TODO: just for the interest */
 int maxLREs;  /* TEMP TODO: just for the interest */
 /*
 * In order to keep the old behaviour, applying strict rules of
 * the spec can be turned off. This has effect only on special
 * mechanisms like whitespace-stripping in the stylesheet.
 */
 int strict;
 xsltPrincipalStylesheetDataPtr psData;
 xsltStyleItemUknownPtr unknownItem;
 int hasNsAliases; /* Indicator if there was an xsl:namespace-alias. */
 xsltNsAliasPtr nsAliases;
 xsltVarInfoPtr ivars; /* Storage of local in-scope variables/params. */
 xsltVarInfoPtr ivar; /* topmost local variable/param. */
 };
 
 #else /* XSLT_REFACTORED */
 /*
 * The old structures before refactoring.
 */
 
 /**
 * _xsltStylePreComp:
 *
 * The in-memory structure corresponding to XSLT stylesheet constructs
 * precomputed data.
 */
 struct _xsltStylePreComp {
 xsltElemPreCompPtr next;    /* chained list */
 xsltStyleType type;        /* type of the element */
 xsltTransformFunction func; /* handling function */
 xmlNodePtr inst;        /* the instruction */
 
 /*
 * Pre computed values.
 */
 
 const xmlChar *stype;       /* sort */
 int      has_stype;        /* sort */
 int      number;        /* sort */
 const xmlChar *order;    /* sort */
 int      has_order;        /* sort */
 int      descending;    /* sort */
 const xmlChar *lang;    /* sort */
 int      has_lang;        /* sort */
 xsltLocale locale;        /* sort */
 const xmlChar *case_order;    /* sort */
 int      lower_first;    /* sort */
 
 const xmlChar *use;        /* copy, element */
 int      has_use;        /* copy, element */
 
 int      noescape;        /* text */
 
 const xmlChar *name;    /* element, attribute, pi */
 int      has_name;        /* element, attribute, pi */
 const xmlChar *ns;        /* element */
 int      has_ns;        /* element */
 
 const xmlChar *mode;    /* apply-templates */
 const xmlChar *modeURI;    /* apply-templates */
 
 const xmlChar *test;    /* if */
 
 xsltTemplatePtr templ;    /* call-template */
 
 const xmlChar *select;    /* sort, copy-of, value-of, apply-templates */
 
 int      ver11;        /* document */
 const xmlChar *filename;    /* document URL */
 int      has_filename;    /* document */
 
 xsltNumberData numdata;    /* number */
 
 xmlXPathCompExprPtr comp;    /* a precompiled XPath expression */
 xmlNsPtr *nsList;        /* the namespaces in scope */
 int nsNr;            /* the number of namespaces in scope */
 };
 
 #endif /* XSLT_REFACTORED */
 
 
 /*
 * The in-memory structure corresponding to an XSLT Variable
 * or Param.
 */
 typedef struct _xsltStackElem xsltStackElem;
 typedef xsltStackElem *xsltStackElemPtr;
 struct _xsltStackElem {
 struct _xsltStackElem *next;/* chained list */
 xsltStylePreCompPtr comp;   /* the compiled form */
 int computed;        /* was the evaluation done */
 const xmlChar *name;    /* the local part of the name QName */
 const xmlChar *nameURI;    /* the URI part of the name QName */
 const xmlChar *select;    /* the eval string */
 xmlNodePtr tree;        /* the sequence constructor if no eval
 string or the location */
 xmlXPathObjectPtr value;    /* The value if computed */
 xmlDocPtr fragment;        /* The Result Tree Fragments (needed for XSLT 1.0)
 which are bound to the variable's lifetime. */
 int level;                  /* the depth in the tree;
 -1 if persistent (e.g. a given xsl:with-param) */
 xsltTransformContextPtr context; /* The transformation context; needed to cache
 the variables */
 int flags;
 };
 
 #ifdef XSLT_REFACTORED
 
 struct _xsltPrincipalStylesheetData {
 /*
 * Namespace dictionary for ns-prefixes and ns-names:
 * TODO: Shared between stylesheets, and XPath mechanisms.
 *   Not used yet.
 */
 xmlDictPtr namespaceDict;
 /*
 * Global list of in-scope namespaces.
 */
 xsltPointerListPtr inScopeNamespaces;
 /*
 * Global list of information for [xsl:]excluded-result-prefixes.
 */
 xsltPointerListPtr exclResultNamespaces;
 /*
 * Global list of information for [xsl:]extension-element-prefixes.
 */
 xsltPointerListPtr extElemNamespaces;
 xsltEffectiveNsPtr effectiveNs;
 #ifdef XSLT_REFACTORED_XSLT_NSCOMP
 /*
 * Namespace name map to get rid of string comparison of namespace names.
 */
 xsltNsMapPtr nsMap;
 #endif
 };
 
 
 #endif
 /*
 * Note that we added a @compCtxt field to anchor an stylesheet compilation
 * context, since, due to historical reasons, various compile-time function
 * take only the stylesheet as argument and not a compilation context.
 */
 struct _xsltStylesheet {
 /*
 * The stylesheet import relation is kept as a tree.
 */
 struct _xsltStylesheet *parent;
 struct _xsltStylesheet *next;
 struct _xsltStylesheet *imports;
 
 xsltDocumentPtr docList;        /* the include document list */
 
 /*
 * General data on the style sheet document.
 */
 xmlDocPtr doc;        /* the parsed XML stylesheet */
 xmlHashTablePtr stripSpaces;/* the hash table of the strip-space and
 preserve space elements */
 int             stripAll;    /* strip-space * (1) preserve-space * (-1) */
 xmlHashTablePtr cdataSection;/* the hash table of the cdata-section */
 
 /*
 * Global variable or parameters.
 */
 xsltStackElemPtr variables; /* linked list of param and variables */
 
 /*
 * Template descriptions.
 */
 xsltTemplatePtr templates;           /* the ordered list of templates */
 xmlHashTablePtr templatesHash;       /* hash table or wherever compiled
 templates information is stored */
 struct _xsltCompMatch *rootMatch;    /* template based on / */
 struct _xsltCompMatch *keyMatch;     /* template based on key() */
 struct _xsltCompMatch *elemMatch;    /* template based on * */
 struct _xsltCompMatch *attrMatch;    /* template based on @* */
 struct _xsltCompMatch *parentMatch;  /* template based on .. */
 struct _xsltCompMatch *textMatch;    /* template based on text() */
 struct _xsltCompMatch *piMatch;      /* template based on
 processing-instruction() */
 struct _xsltCompMatch *commentMatch; /* template based on comment() */
 
 /*
 * Namespace aliases.
 * NOTE: Not used in the refactored code.
 */
 xmlHashTablePtr nsAliases;    /* the namespace alias hash tables */
 
 /*
 * Attribute sets.
 */
 xmlHashTablePtr attributeSets;/* the attribute sets hash tables */
 
 /*
 * Namespaces.
 * TODO: Eliminate this.
 */
 xmlHashTablePtr nsHash;     /* the set of namespaces in use:
 ATTENTION: This is used for
 execution of XPath expressions; unfortunately
 it restricts the stylesheet to have distinct
 prefixes.
 TODO: We need to get rid of this.
 */
 void           *nsDefs;     /* ATTENTION TODO: This is currently used to store
 xsltExtDefPtr (in extensions.c) and
 *not* xmlNsPtr.
 */
 
 /*
 * Key definitions.
 */
 void *keys;            /* key definitions */
 
 /*
 * Output related stuff.
 */
 xmlChar *method;        /* the output method */
 xmlChar *methodURI;        /* associated namespace if any */
 xmlChar *version;        /* version string */
 xmlChar *encoding;        /* encoding string */
 int omitXmlDeclaration;     /* omit-xml-declaration = "yes" | "no" */
 
 /*
 * Number formatting.
 */
 xsltDecimalFormatPtr decimalFormat;
 int standalone;             /* standalone = "yes" | "no" */
 xmlChar *doctypePublic;     /* doctype-public string */
 xmlChar *doctypeSystem;     /* doctype-system string */
 int indent;            /* should output being indented */
 xmlChar *mediaType;        /* media-type string */
 
 /*
 * Precomputed blocks.
 */
 xsltElemPreCompPtr preComps;/* list of precomputed blocks */
 int warnings;        /* number of warnings found at compilation */
 int errors;            /* number of errors found at compilation */
 
 xmlChar  *exclPrefix;    /* last excluded prefixes */
 xmlChar **exclPrefixTab;    /* array of excluded prefixes */
 int       exclPrefixNr;    /* number of excluded prefixes in scope */
 int       exclPrefixMax;    /* size of the array */
 
 void     *_private;        /* user defined data */
 
 /*
 * Extensions.
 */
 xmlHashTablePtr extInfos;    /* the extension data */
 int            extrasNr;    /* the number of extras required */
 
 /*
 * For keeping track of nested includes
 */
 xsltDocumentPtr includes;    /* points to last nested include */
 
 /*
 * dictionary: shared between stylesheet, context and documents.
 */
 xmlDictPtr dict;
 /*
 * precompiled attribute value templates.
 */
 void *attVTs;
 /*
 * if namespace-alias has an alias for the default stylesheet prefix
 * NOTE: Not used in the refactored code.
 */
 const xmlChar *defaultAlias;
 /*
 * bypass pre-processing (already done) (used in imports)
 */
 int nopreproc;
 /*
 * all document text strings were internalized
 */
 int internalized;
 /*
 * Literal Result Element as Stylesheet c.f. section 2.3
 */
 int literal_result;
 /*
 * The principal stylesheet
 */
 xsltStylesheetPtr principal;
 #ifdef XSLT_REFACTORED
 /*
 * Compilation context used during compile-time.
 */
 xsltCompilerCtxtPtr compCtxt; /* TODO: Change this to (void *). */
 
 xsltPrincipalStylesheetDataPtr principalData;
 #endif
 /*
 * Forwards-compatible processing
 */
 int forwards_compatible;
 
 xmlHashTablePtr namedTemplates; /* hash table of named templates */
 
 xmlXPathContextPtr xpathCtxt;
 };
 
 typedef struct _xsltTransformCache xsltTransformCache;
 typedef xsltTransformCache *xsltTransformCachePtr;
 struct _xsltTransformCache {
 xmlDocPtr RVT;
 int nbRVT;
 xsltStackElemPtr stackItems;
 int nbStackItems;
 #ifdef XSLT_DEBUG_PROFILE_CACHE
 int dbgCachedRVTs;
 int dbgReusedRVTs;
 int dbgCachedVars;
 int dbgReusedVars;
 #endif
 };
 
 /*
 * The in-memory structure corresponding to an XSLT Transformation.
 */
 typedef enum {
 XSLT_OUTPUT_XML = 0,
 XSLT_OUTPUT_HTML,
 XSLT_OUTPUT_TEXT
 } xsltOutputType;
 
 typedef enum {
 XSLT_STATE_OK = 0,
 XSLT_STATE_ERROR,
 XSLT_STATE_STOPPED
 } xsltTransformState;
 
 struct _xsltTransformContext {
 xsltStylesheetPtr style;        /* the stylesheet used */
 xsltOutputType type;        /* the type of output */
 
 xsltTemplatePtr  templ;        /* the current template */
 int              templNr;        /* Nb of templates in the stack */
 int              templMax;        /* Size of the templtes stack */
 xsltTemplatePtr *templTab;        /* the template stack */
 
 xsltStackElemPtr  vars;        /* the current variable list */
 int               varsNr;        /* Nb of variable list in the stack */
 int               varsMax;        /* Size of the variable list stack */
 xsltStackElemPtr *varsTab;        /* the variable list stack */
 int               varsBase;        /* the var base for current templ */
 
 /*
 * Extensions
 */
 xmlHashTablePtr   extFunctions;    /* the extension functions */
 xmlHashTablePtr   extElements;    /* the extension elements */
 xmlHashTablePtr   extInfos;        /* the extension data */
 
 const xmlChar *mode;        /* the current mode */
 const xmlChar *modeURI;        /* the current mode URI */
 
 xsltDocumentPtr docList;        /* the document list */
 
 xsltDocumentPtr document;        /* the current source document; can be NULL if an RTF */
 xmlNodePtr node;            /* the current node being processed */
 xmlNodeSetPtr nodeList;        /* the current node list */
 /* xmlNodePtr current;            the node */
 
 xmlDocPtr output;            /* the resulting document */
 xmlNodePtr insert;            /* the insertion node */
 
 xmlXPathContextPtr xpathCtxt;    /* the XPath context */
 xsltTransformState state;        /* the current state */
 
 /*
 * Global variables
 */
 xmlHashTablePtr   globalVars;    /* the global variables and params */
 
 xmlNodePtr inst;            /* the instruction in the stylesheet */
 
 int xinclude;            /* should XInclude be processed */
 
 const char *      outputFile;    /* the output URI if known */
 
 int profile;                        /* is this run profiled */
 long             prof;        /* the current profiled value */
 int              profNr;        /* Nb of templates in the stack */
 int              profMax;        /* Size of the templtaes stack */
 long            *profTab;        /* the profile template stack */
 
 void            *_private;        /* user defined data */
 
 int              extrasNr;        /* the number of extras used */
 int              extrasMax;        /* the number of extras allocated */
 xsltRuntimeExtraPtr extras;        /* extra per runtime information */
 
 xsltDocumentPtr  styleList;        /* the stylesheet docs list */
 void                 * sec;        /* the security preferences if any */
 
 xmlGenericErrorFunc  error;        /* a specific error handler */
 void              * errctx;        /* context for the error handler */
 
 xsltSortFunc      sortfunc;        /* a ctxt specific sort routine */
 
 /*
 * handling of temporary Result Value Tree
 * (XSLT 1.0 term: "Result Tree Fragment")
 */
 xmlDocPtr       tmpRVT;        /* list of RVT without persistance */
 xmlDocPtr       persistRVT;        /* list of persistant RVTs */
 int             ctxtflags;          /* context processing flags */
 
 /*
 * Speed optimization when coalescing text nodes
 */
 const xmlChar  *lasttext;        /* last text node content */
 int             lasttsize;        /* last text node size */
 int             lasttuse;        /* last text node use */
 /*
 * Per Context Debugging
 */
 int debugStatus;            /* the context level debug status */
 unsigned long* traceCode;        /* pointer to the variable holding the mask */
 
 int parserOptions;            /* parser options xmlParserOption */
 
 /*
 * dictionary: shared between stylesheet, context and documents.
 */
 xmlDictPtr dict;
 xmlDocPtr        tmpDoc; /* Obsolete; not used in the library. */
 /*
 * all document text strings are internalized
 */
 int internalized;
 int nbKeys;
 int hasTemplKeyPatterns;
 xsltTemplatePtr currentTemplateRule; /* the Current Template Rule */
 xmlNodePtr initialContextNode;
 xmlDocPtr initialContextDoc;
 xsltTransformCachePtr cache;
 void *contextVariable; /* the current variable item */
 xmlDocPtr localRVT; /* list of local tree fragments; will be freed when
 the instruction which created the fragment
 exits */
 xmlDocPtr localRVTBase; /* Obsolete */
 int keyInitLevel;   /* Needed to catch recursive keys issues */
 int depth;          /* Needed to catch recursions */
 int maxTemplateDepth;
 int maxTemplateVars;
 unsigned long opLimit;
 unsigned long opCount;
 };
 
 /**
 * CHECK_STOPPED:
 *
 * Macro to check if the XSLT processing should be stopped.
 * Will return from the function.
 */
 #define CHECK_STOPPED if (ctxt->state == XSLT_STATE_STOPPED) return;
 
 /**
 * CHECK_STOPPEDE:
 *
 * Macro to check if the XSLT processing should be stopped.
 * Will goto the error: label.
 */
 #define CHECK_STOPPEDE if (ctxt->state == XSLT_STATE_STOPPED) goto error;
 
 /**
 * CHECK_STOPPED0:
 *
 * Macro to check if the XSLT processing should be stopped.
 * Will return from the function with a 0 value.
 */
 #define CHECK_STOPPED0 if (ctxt->state == XSLT_STATE_STOPPED) return(0);
 
 /*
 * The macro XML_CAST_FPTR is a hack to avoid a gcc warning about
 * possible incompatibilities between function pointers and object
 * pointers.  It is defined in libxml/hash.h within recent versions
 * of libxml2, but is put here for compatibility.
 */
 #ifndef XML_CAST_FPTR
 /**
 * XML_CAST_FPTR:
 * @fptr:  pointer to a function
 *
 * Macro to do a casting from an object pointer to a
 * function pointer without encountering a warning from
 * gcc
 *
 * #define XML_CAST_FPTR(fptr) (*(void **)(&fptr))
 * This macro violated ISO C aliasing rules (gcc4 on s390 broke)
 * so it is disabled now
 */
 
 #define XML_CAST_FPTR(fptr) fptr
 #endif
 /*
 * Functions associated to the internal types
 xsltDecimalFormatPtr    xsltDecimalFormatGetByName(xsltStylesheetPtr sheet,
 xmlChar *name);
 */
 XSLTPUBFUN xsltStylesheetPtr XSLTCALL
 xsltNewStylesheet    (void);
 XSLTPUBFUN xsltStylesheetPtr XSLTCALL
 xsltParseStylesheetFile    (const xmlChar* filename);
 XSLTPUBFUN void XSLTCALL
 xsltFreeStylesheet    (xsltStylesheetPtr style);
 XSLTPUBFUN int XSLTCALL
 xsltIsBlank        (xmlChar *str);
 XSLTPUBFUN void XSLTCALL
 xsltFreeStackElemList    (xsltStackElemPtr elem);
 XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL
 xsltDecimalFormatGetByName(xsltStylesheetPtr style,
 xmlChar *name);
 XSLTPUBFUN xsltDecimalFormatPtr XSLTCALL
 xsltDecimalFormatGetByQName(xsltStylesheetPtr style,
 const xmlChar *nsUri,
 const xmlChar *name);
 
 XSLTPUBFUN xsltStylesheetPtr XSLTCALL
 xsltParseStylesheetProcess(xsltStylesheetPtr ret,
 xmlDocPtr doc);
 XSLTPUBFUN void XSLTCALL
 xsltParseStylesheetOutput(xsltStylesheetPtr style,
 xmlNodePtr cur);
 XSLTPUBFUN xsltStylesheetPtr XSLTCALL
 xsltParseStylesheetDoc    (xmlDocPtr doc);
 XSLTPUBFUN xsltStylesheetPtr XSLTCALL
 xsltParseStylesheetImportedDoc(xmlDocPtr doc,
 xsltStylesheetPtr style);
 XSLTPUBFUN int XSLTCALL
 xsltParseStylesheetUser(xsltStylesheetPtr style,
 xmlDocPtr doc);
 XSLTPUBFUN xsltStylesheetPtr XSLTCALL
 xsltLoadStylesheetPI    (xmlDocPtr doc);
 XSLTPUBFUN void XSLTCALL
 xsltNumberFormat    (xsltTransformContextPtr ctxt,
 xsltNumberDataPtr data,
 xmlNodePtr node);
 XSLTPUBFUN xmlXPathError XSLTCALL
 xsltFormatNumberConversion(xsltDecimalFormatPtr self,
 xmlChar *format,
 double number,
 xmlChar **result);
 
 XSLTPUBFUN void XSLTCALL
 xsltParseTemplateContent(xsltStylesheetPtr style,
 xmlNodePtr templ);
 XSLTPUBFUN int XSLTCALL
 xsltAllocateExtra    (xsltStylesheetPtr style);
 XSLTPUBFUN int XSLTCALL
 xsltAllocateExtraCtxt    (xsltTransformContextPtr ctxt);
 /*
 * Extra functions for Result Value Trees
 */
 XSLTPUBFUN xmlDocPtr XSLTCALL
 xsltCreateRVT        (xsltTransformContextPtr ctxt);
 XSLTPUBFUN int XSLTCALL
 xsltRegisterTmpRVT    (xsltTransformContextPtr ctxt,
 xmlDocPtr RVT);
 XSLTPUBFUN int XSLTCALL
 xsltRegisterLocalRVT    (xsltTransformContextPtr ctxt,
 xmlDocPtr RVT);
 XSLTPUBFUN int XSLTCALL
 xsltRegisterPersistRVT    (xsltTransformContextPtr ctxt,
 xmlDocPtr RVT);
 XSLTPUBFUN int XSLTCALL
 xsltExtensionInstructionResultRegister(
 xsltTransformContextPtr ctxt,
 xmlXPathObjectPtr obj);
 XSLTPUBFUN int XSLTCALL
 xsltExtensionInstructionResultFinalize(
 xsltTransformContextPtr ctxt);
 XSLTPUBFUN int XSLTCALL
 xsltFlagRVTs(
 xsltTransformContextPtr ctxt,
 xmlXPathObjectPtr obj,
 void *val);
 XSLTPUBFUN void XSLTCALL
 xsltFreeRVTs        (xsltTransformContextPtr ctxt);
 XSLTPUBFUN void XSLTCALL
 xsltReleaseRVT        (xsltTransformContextPtr ctxt,
 xmlDocPtr RVT);
 /*
 * Extra functions for Attribute Value Templates
 */
 XSLTPUBFUN void XSLTCALL
 xsltCompileAttr        (xsltStylesheetPtr style,
 xmlAttrPtr attr);
 XSLTPUBFUN xmlChar * XSLTCALL
 xsltEvalAVT        (xsltTransformContextPtr ctxt,
 void *avt,
 xmlNodePtr node);
 XSLTPUBFUN void XSLTCALL
 xsltFreeAVTList        (void *avt);
 
 /*
 * Extra function for successful xsltCleanupGlobals / xsltInit sequence.
 */
 
 XSLTPUBFUN void XSLTCALL
 xsltUninit        (void);
 
 /************************************************************************
 *                                    *
 *  Compile-time functions for *internal* use only                      *
 *                                    *
 ************************************************************************/
 
 #ifdef XSLT_REFACTORED
 XSLTPUBFUN void XSLTCALL
 xsltParseSequenceConstructor(
 xsltCompilerCtxtPtr cctxt,
 xmlNodePtr start);
 XSLTPUBFUN int XSLTCALL
 xsltParseAnyXSLTElem    (xsltCompilerCtxtPtr cctxt,
 xmlNodePtr elem);
 #ifdef XSLT_REFACTORED_XSLT_NSCOMP
 XSLTPUBFUN int XSLTCALL
 xsltRestoreDocumentNamespaces(
 xsltNsMapPtr ns,
 xmlDocPtr doc);
 #endif
 #endif /* XSLT_REFACTORED */
 
 /************************************************************************
 *                                    *
 *  Transformation-time functions for *internal* use only               *
 *                                    *
 ************************************************************************/
 XSLTPUBFUN int XSLTCALL
 xsltInitCtxtKey        (xsltTransformContextPtr ctxt,
 xsltDocumentPtr doc,
 xsltKeyDefPtr keyd);
 XSLTPUBFUN int XSLTCALL
 xsltInitAllDocKeys    (xsltTransformContextPtr ctxt);
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* __XML_XSLT_H__ */
 
 
 |