1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978 |
- /*
- * 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 */
- };
- /**
- * 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 */
- void *templatesHash; /* hash table or wherever compiled templates
- information is stored */
- void *rootMatch; /* template based on / */
- void *keyMatch; /* template based on key() */
- void *elemMatch; /* template based on * */
- void *attrMatch; /* template based on @* */
- void *parentMatch; /* template based on .. */
- void *textMatch; /* template based on text() */
- void *piMatch; /* template based on processing-instruction() */
- void *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__ */
|