123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983 |
- /*
- * 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__ */
|