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