15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transform.c: Implementation of the XSL Transformation 1.0 engine 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transform part, i.e. applying a Stylesheet to a document 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * References: 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.w3.org/TR/1999/REC-xslt-19991116 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Michael Kay "XSLT Programmer's Reference" pp 637-643 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Writing Multiple Output Files 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XSLT-1.1 Working Draft 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.w3.org/TR/xslt11#multiple-output 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXSLT 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxslt.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parser.h> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h> 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/valid.h> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/hash.h> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/encoding.h> 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h> 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpath.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/parserInternals.h> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xpathInternals.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/HTMLtree.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/debugXML.h> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xslt.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xsltInternals.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xsltutils.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pattern.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "transform.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "variables.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "numbersInternals.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "namespaces.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "attributes.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "templates.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "imports.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "keys.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "documents.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "extensions.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "extra.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "preproc.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "security.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WITH_XSLT_DEBUG_EXTRA 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WITH_XSLT_DEBUG_PROCESS 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define XSLT_GENERATE_HTML_DOCTYPE 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_GENERATE_HTML_DOCTYPE 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xsltGetHTMLIDs(const xmlChar *version, const xmlChar **publicID, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar **systemID); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int xsltMaxDepth = 3000; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Useful macros 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef FALSE 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define FALSE (0 == 1) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define TRUE (!FALSE) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_BLANK_NODE(n) \ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((n)->type == XML_TEXT_NODE) && (xsltIsBlank((n)->content))) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Forward declarations 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyNamespaceListInternal(xmlNodePtr node, xmlNsPtr cur); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyTreeInternal(xsltTransformContextPtr ctxt, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr invocNode, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr insert, int isLRE, int topElemVisited); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplySequenceConstructor(xsltTransformContextPtr ctxt, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr contextNode, xmlNodePtr list, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyXSLTTemplate(xsltTransformContextPtr ctxt, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr contextNode, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr list, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr withParams); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * templPush: 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the transformation context 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the template to push on the stack 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push a template on the stack 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new index in the stack or 0 in case of error 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)templPush(xsltTransformContextPtr ctxt, xsltTemplatePtr value) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->templMax == 0) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templMax = 4; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templTab = 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTemplatePtr *) xmlMalloc(ctxt->templMax * 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->templTab[0])); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->templTab == NULL) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "malloc failed !\n"); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->templNr >= ctxt->templMax) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templMax *= 2; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templTab = 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTemplatePtr *) xmlRealloc(ctxt->templTab, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templMax * 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->templTab[0])); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->templTab == NULL) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "realloc failed !\n"); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templTab[ctxt->templNr] = value; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templ = value; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ctxt->templNr++); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * templPop: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the transformation context 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop a template value from the stack 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the stored template value 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xsltTemplatePtr 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)templPop(xsltTransformContextPtr ctxt) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr ret; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->templNr <= 0) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templNr--; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->templNr > 0) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templ = ctxt->templTab[ctxt->templNr - 1]; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templ = (xsltTemplatePtr) 0; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->templTab[ctxt->templNr]; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->templTab[ctxt->templNr] = 0; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltLocalVariablePop: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the transformation context 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @limitNr: number of variables which should remain 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @level: the depth in the xsl:template's tree 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pops all variable values at the given @depth from the stack. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the stored variable value 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * **NOTE:** 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is an internal routine and should not be called by users! 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltLocalVariablePop(xsltTransformContextPtr ctxt, int limitNr, int level) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr variable; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsNr <= 0) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsNr <= limitNr) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variable = ctxt->varsTab[ctxt->varsNr - 1]; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (variable->level <= level) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (variable->level >= 0) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeStackElemList(variable); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsNr--; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (ctxt->varsNr != 0); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsNr > 0) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->vars = ctxt->varsTab[ctxt->varsNr - 1]; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->vars = NULL; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltTemplateParamsCleanup: 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Removes xsl:param and xsl:with-param items from the 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * variable-stack. Only xsl:with-param items are not freed. 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltTemplateParamsCleanup(xsltTransformContextPtr ctxt) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr param; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; ctxt->varsNr > ctxt->varsBase; ctxt->varsNr--) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param = ctxt->varsTab[ctxt->varsNr -1]; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free xsl:param items. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsl:with-param items will have a level of -1 or -2. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (param->level >= 0) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeStackElemList(param); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsNr > 0) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->vars = ctxt->varsTab[ctxt->varsNr - 1]; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->vars = NULL; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * profPush: 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the transformation context 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: the profiling value to push on the stack 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push a profiling value on the stack 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the new index in the stack or 0 in case of error 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)profPush(xsltTransformContextPtr ctxt, long value) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profMax == 0) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profMax = 4; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profTab = 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (long *) xmlMalloc(ctxt->profMax * sizeof(ctxt->profTab[0])); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profTab == NULL) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "malloc failed !\n"); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profNr >= ctxt->profMax) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profMax *= 2; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profTab = 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (long *) xmlRealloc(ctxt->profTab, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profMax * sizeof(ctxt->profTab[0])); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profTab == NULL) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "realloc failed !\n"); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profTab[ctxt->profNr] = value; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->prof = value; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ctxt->profNr++); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * profPop: 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the transformation context 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop a profiling value from the stack 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the stored profiling value 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static long 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)profPop(xsltTransformContextPtr ctxt) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long ret; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profNr <= 0) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (0); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profNr--; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profNr > 0) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->prof = ctxt->profTab[ctxt->profNr - 1]; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->prof = (long) 0; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = ctxt->profTab[ctxt->profNr]; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profTab[ctxt->profNr] = 0; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XInclude default settings * 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int xsltDoXIncludeDefault = 0; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltSetXIncludeDefault: 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @xinclude: whether to do XInclude processing 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set whether XInclude should be processed on document being loaded by default 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSetXIncludeDefault(int xinclude) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDoXIncludeDefault = (xinclude != 0); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltGetXIncludeDefault: 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides the default state for XInclude processing 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 if there is no processing 1 otherwise 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltGetXIncludeDefault(void) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltDoXIncludeDefault); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned long xsltDefaultTrace = (unsigned long) XSLT_TRACE_ALL; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltDebugSetDefaultTrace: 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @val: tracing level mask 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the default debug tracing level mask 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void xsltDebugSetDefaultTrace(xsltDebugTraceCodes val) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDefaultTrace = val; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltDebugGetDefaultTrace: 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the current default debug tracing level mask 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the current default debug tracing level mask 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltDebugTraceCodes xsltDebugGetDefaultTrace() { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return xsltDefaultTrace; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handling of Transformation Contexts * 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xsltTransformCachePtr 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltTransformCacheCreate(void) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformCachePtr ret; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xsltTransformCachePtr) xmlMalloc(sizeof(xsltTransformCache)); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, NULL, NULL, 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltTransformCacheCreate : malloc failed\n"); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xsltTransformCache)); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltTransformCacheFree(xsltTransformCachePtr cache) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cache == NULL) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free tree fragments. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cache->RVT) { 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr tmp, cur = cache->RVT; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur) { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = (xmlDocPtr) cur->next; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->_private != NULL) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Tree the document info. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeDocumentKeys((xsltDocumentPtr) tmp->_private); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(tmp->_private); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(tmp); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free vars/params. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cache->stackItems) { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr tmp, cur = cache->stackItems; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT TODO: Should be call a destruction-function 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instead? 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(tmp); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(cache); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltNewTransformContext: 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: a parsed XSLT stylesheet 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: the input document 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new XSLT TransformContext 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the newly allocated xsltTransformContextPtr or NULL in case of error 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltTransformContextPtr 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltNewTransformContext(xsltStylesheetPtr style, xmlDocPtr doc) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr cur; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDocumentPtr docu; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltInitGlobals(); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = (xsltTransformContextPtr) xmlMalloc(sizeof(xsltTransformContext)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, NULL, (xmlNodePtr)doc, 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltNewTransformContext : malloc failed\n"); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(cur, 0, sizeof(xsltTransformContext)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->cache = xsltTransformCacheCreate(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->cache == NULL) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto internal_err; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * setup of the dictionary must be done early as some of the 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * processing later like key handling may need it. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->dict = xmlDictCreateSub(style->dict); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->internalized = ((style->internalized) && (cur->dict != NULL)); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Creating sub-dictionary from stylesheet for transformation\n"); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * initialize the template stack 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->templTab = (xsltTemplatePtr *) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(10 * sizeof(xsltTemplatePtr)); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->templTab == NULL) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, NULL, (xmlNodePtr) doc, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltNewTransformContext: out of memory\n"); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto internal_err; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->templNr = 0; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->templMax = 5; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->templ = NULL; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * initialize the variables stack 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->varsTab = (xsltStackElemPtr *) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(10 * sizeof(xsltStackElemPtr)); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->varsTab == NULL) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltNewTransformContext: out of memory\n"); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto internal_err; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->varsNr = 0; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->varsMax = 10; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->vars = NULL; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->varsBase = 0; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the profiling stack is not initialized by default 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->profTab = NULL; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->profNr = 0; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->profMax = 0; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->prof = 0; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->style = style; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathInit(); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->xpathCtxt = xmlXPathNewContext(doc); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->xpathCtxt == NULL) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, NULL, (xmlNodePtr) doc, 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltNewTransformContext : xmlXPathNewContext failed\n"); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto internal_err; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create an XPath cache. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlXPathContextSetCache(cur->xpathCtxt, 1, -1, 0) == -1) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto internal_err; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initialize the extras array 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->extrasNr != 0) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extrasMax = style->extrasNr + 20; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extras = (xsltRuntimeExtraPtr) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlMalloc(cur->extrasMax * sizeof(xsltRuntimeExtra)); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->extras == NULL) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltNewTransformContext: out of memory\n"); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto internal_err; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extrasNr = style->extrasNr; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < cur->extrasMax;i++) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extras[i].info = NULL; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extras[i].deallocate = NULL; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extras[i].val.ptr = NULL; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extras = NULL; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extrasNr = 0; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->extrasMax = 0; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_REGISTER_VARIABLE_LOOKUP(cur); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_REGISTER_FUNCTION_LOOKUP(cur); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->xpathCtxt->nsHash = style->nsHash; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initialize the registered external modules 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltInitCtxtExts(cur); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Setup document element ordering for later efficiencies 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (bug 133289) 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xslDebugStatus == XSLT_DEBUG_NONE) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathOrderDocElems(doc); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Must set parserOptions before calling xsltNewDocument 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (bug 164530) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parserOptions = XSLT_PARSE_OPTIONS; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docu = xsltNewDocument(cur, doc); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (docu == NULL) { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(cur, NULL, (xmlNodePtr)doc, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltNewTransformContext : xsltNewDocument failed\n"); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto internal_err; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docu->main = 1; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->document = docu; 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->inst = NULL; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->outputFile = NULL; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->sec = xsltGetDefaultSecurityPrefs(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->debugStatus = xslDebugStatus; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->traceCode = (unsigned long*) &xsltDefaultTrace; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->xinclude = xsltGetXIncludeDefault(); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->keyInitLevel = 0; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal_err: 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur != NULL) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeTransformContext(cur); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltFreeTransformContext: 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT parser context 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up the memory allocated by @ctxt 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltFreeTransformContext(xsltTransformContextPtr ctxt) { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Shutdown the extension modules associated to the stylesheet 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * used if needed. 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltShutdownCtxtExts(ctxt); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->xpathCtxt != NULL) { 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->nsHash = NULL; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeContext(ctxt->xpathCtxt); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->templTab != NULL) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->templTab); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsTab != NULL) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->varsTab); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profTab != NULL) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->profTab); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->extrasNr > 0) && (ctxt->extras != NULL)) { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < ctxt->extrasNr;i++) { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->extras[i].deallocate != NULL) && 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->extras[i].info != NULL)) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->extras[i].deallocate(ctxt->extras[i].info); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt->extras); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeGlobalVariables(ctxt); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeDocuments(ctxt); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeCtxtExts(ctxt); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeRVTs(ctxt); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformCacheFree(ctxt->cache); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictFree(ctxt->dict); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "freeing transformation dictionary\n"); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ctxt, -1, sizeof(xsltTransformContext)); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(ctxt); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy of Nodes in an XSLT fashion * 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr xsltCopyTree(xsltTransformContextPtr ctxt, 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node, xmlNodePtr insert, int literal); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltAddChild: 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @parent: the parent node 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the child node 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Wrapper version of xmlAddChild with a more consistent behaviour on 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error. One expect the use to be child = xsltAddChild(parent, child); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and the routine will take care of not leaking on errors or node merge 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the child is successfully attached or NULL if merged or freed 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltAddChild(xmlNodePtr parent, xmlNodePtr cur) { 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr ret; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == NULL) || (parent == NULL)) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (parent == NULL) { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(cur); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlAddChild(parent, cur); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltAddTextString: 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the text node where the text will be attached 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @string: the text string 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @len: the string length in byte 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extend the current text node with the new string, it handles coalescing 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: the text node 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltAddTextString(xsltTransformContextPtr ctxt, xmlNodePtr target, 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *string, int len) { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * optimization 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((len <= 0) || (string == NULL) || (target == NULL)) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(target); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->lasttext == target->content) { 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->lasttuse + len >= ctxt->lasttsize) { 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *newbuf; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size = ctxt->lasttsize + len + 100; 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size *= 2; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newbuf = (xmlChar *) xmlRealloc(target->content,size); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (newbuf == NULL) { 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, target, 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyText: text allocation failed\n"); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttsize = size; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = newbuf; 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->content = newbuf; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&(target->content[ctxt->lasttuse]), string, len); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttuse += len; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->content[ctxt->lasttuse] = 0; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeAddContent(target, string); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = target->content; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(target->content); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttsize = len; 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttuse = len; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(target); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyTextString: 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the element where the text will be attached 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @string: the text string 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @noescape: should disable-escaping be activated for this text node. 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Adds @string to a newly created or an existent text node child of 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: the text node, where the text content of @cur is copied to. 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of API or internal errors. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyTextString(xsltTransformContextPtr ctxt, xmlNodePtr target, 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *string, int noescape) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (string == NULL) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_TEXT,xsltGenericDebug(xsltGenericDebugContext, 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyTextString: copy text %s\n", 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string)); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Play save and reset the merging mechanism for every new 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * target node. 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((target == NULL) || (target->children == NULL)) { 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = NULL; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* handle coalescing of text nodes here */ 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(string); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->type == XSLT_OUTPUT_XML) && 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->style->cdataSection != NULL) && 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target != NULL) && 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->type == XML_ELEMENT_NODE) && 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((target->ns == NULL) && 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashLookup2(ctxt->style->cdataSection, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->name, NULL) != NULL)) || 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((target->ns != NULL) && 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashLookup2(ctxt->style->cdataSection, 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->name, target->ns->href) != NULL)))) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process "cdata-section-elements". 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((target->last != NULL) && 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last->type == XML_CDATA_SECTION_NODE)) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltAddTextString(ctxt, target->last, string, len)); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewCDataBlock(ctxt->output, string, len); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (noescape) { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process "disable-output-escaping". 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((target != NULL) && (target->last != NULL) && 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last->type == XML_TEXT_NODE) && 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last->name == xmlStringTextNoenc)) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltAddTextString(ctxt, target->last, string, len)); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewTextLen(string, len); 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy != NULL) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->name = xmlStringTextNoenc; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Default processing. 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((target != NULL) && (target->last != NULL) && 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last->type == XML_TEXT_NODE) && 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last->name == xmlStringText)) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltAddTextString(ctxt, target->last, string, len)); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewTextLen(string, len); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy != NULL) { 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target != NULL) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(target, copy); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = copy->content; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttsize = len; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttuse = len; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, target, 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyTextString: text copy failed\n"); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = NULL; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(copy); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyText: 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the element where the text will be attached 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the text or CDATA node 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @interned: the string is in the target doc dictionary 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy the text content of @cur and append it to @target's children. 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: the text node, where the text content of @cur is copied to. 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NULL in case of API or internal errors. 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyText(xsltTransformContextPtr ctxt, xmlNodePtr target, 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, int interned) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_TEXT_NODE) && 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type != XML_CDATA_SECTION_NODE)) 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content == NULL) 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_CDATA_SECTION_NODE) { 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_TEXT,xsltGenericDebug(xsltGenericDebugContext, 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyText: copy CDATA text %s\n", 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->name == xmlStringTextNoenc) { 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_TEXT,xsltGenericDebug(xsltGenericDebugContext, 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyText: copy unescaped text %s\n", 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_TEXT,xsltGenericDebug(xsltGenericDebugContext, 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyText: copy text %s\n", 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Play save and reset the merging mechanism for every new 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * target node. 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((target == NULL) || (target->children == NULL)) { 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = NULL; 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->style->cdataSection != NULL) && 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->type == XSLT_OUTPUT_XML) && 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target != NULL) && 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->type == XML_ELEMENT_NODE) && 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((target->ns == NULL) && 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashLookup2(ctxt->style->cdataSection, 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->name, NULL) != NULL)) || 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((target->ns != NULL) && 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashLookup2(ctxt->style->cdataSection, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->name, target->ns->href) != NULL)))) 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process "cdata-section-elements". 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OPTIMIZE TODO: xsltCopyText() is also used for attribute content. 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Since this doesn't merge adjacent CDATA-section nodes, 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we'll get: <![CDATA[x]]><!CDATA[y]]>. 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Reported in #321505. 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((target->last != NULL) && 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last->type == XML_CDATA_SECTION_NODE)) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append to existing CDATA-section node. 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddTextString(ctxt, target->last, cur->content, 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrlen(cur->content)); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int len; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(cur->content); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewCDataBlock(ctxt->output, cur->content, len); 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = copy->content; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttsize = len; 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttuse = len; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((target != NULL) && 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last != NULL) && 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* both escaped or both non-escaped text-nodes */ 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((target->last->type == XML_TEXT_NODE) && 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->last->name == cur->name)) || 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* non-escaped text nodes and CDATA-section nodes */ 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (((target->last->type == XML_CDATA_SECTION_NODE) && 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->name == xmlStringTextNoenc))))) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we are appending to an existing text node 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddTextString(ctxt, target->last, cur->content, 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrlen(cur->content)); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((interned) && (target != NULL) && 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->doc != NULL) && 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->doc->dict == ctxt->dict)) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: DO we want to use this also for "text" output? 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewTextLen(NULL, 0); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->name == xmlStringTextNoenc) 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->name = xmlStringTextNoenc; 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Must confirm that content is in dict (bug 302821) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: This check should be not needed for text coming 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from the stylesheets 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlDictOwns(ctxt->dict, cur->content)) 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->content = cur->content; 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((copy->content = xmlStrdup(cur->content)) == NULL) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * normal processing. keep counters to extend the text node 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in xsltAddTextString if needed. 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int len; 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(cur->content); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewTextLen(cur->content, len); 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->name == xmlStringTextNoenc) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->name = xmlStringTextNoenc; 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttext = copy->content; 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttsize = len; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->lasttuse = len; 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy != NULL) { 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target != NULL) { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->doc = target->doc; 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MAYBE TODO: Maybe we should reset the ctxt->lasttext here 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to ensure that the optimized text-merging mechanism 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * won't interfere with normal node-merging in any case. 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(target, copy); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, target, 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyText: text copy failed\n"); 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit: 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((copy == NULL) || (copy->content == NULL)) { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, target, 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltCopyText(): " 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to copy the string.\n"); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(copy); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltShallowCopyAttr: 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @invocNode: responsible node in the stylesheet; used for error reports 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the element where the attribute will be grafted 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the attribute to be copied 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of an attribute. 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called by: 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - xsltCopyTreeInternal() 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - xsltCopyOf() 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - xsltCopy() 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new xmlAttrPtr, or NULL in case of error. 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlAttrPtr 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltShallowCopyAttr(xsltTransformContextPtr ctxt, xmlNodePtr invocNode, 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr target, xmlAttrPtr attr) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr copy; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value; 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attr == NULL) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target->type != XML_ELEMENT_NODE) { 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, invocNode, 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cannot add an attribute node to a non-element node.\n"); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target->children != NULL) { 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, invocNode, 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Attribute nodes must be added before " 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "any child nodes to an element.\n"); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xmlNodeListGetString(attr->doc, attr->children, 1); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attr->ns != NULL) { 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xsltGetSpecialNamespace(ctxt, invocNode, 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr->ns->href, attr->ns->prefix, target); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, invocNode, 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Namespace fixup error: Failed to acquire an in-scope " 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "namespace binding of the copied attribute '{%s}%s'.\n", 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr->ns->href, attr->name); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Should we just stop here? 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that xmlSetNsProp() will take care of duplicates 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and assigns the new namespace even to a duplicate. 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlSetNsProp(target, ns, attr->name, value); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlSetNsProp(target, NULL, attr->name, value); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != NULL) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: This was optimized according to bug #342695. 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Can this further be optimized, if source and target 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * share the same dict and attr->children is just 1 text node 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which is in the dict? How probable is such a case? 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Do we need to create an empty text node if the value 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is the empty string? 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xmlNodeListGetString(attr->doc, attr->children, 1); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != NULL) { 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) txtNode = xmlNewDocText(target->doc, NULL); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (txtNode == NULL) 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((target->doc != NULL) && 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (target->doc->dict != NULL)) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) txtNode->content = 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlChar *) xmlDictLookup(target->doc->dict, 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST value, -1); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) txtNode->content = value; 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->children = txtNode; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(copy); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyAttrListNoOverwrite: 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @invocNode: responsible node in the stylesheet; used for error reports 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target: the element where the new attributes will be grafted 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @attr: the first attribute in the list to be copied 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copies a list of attribute nodes, starting with @attr, over to the 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @target element node. 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called by: 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - xsltCopyTreeInternal() 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 on success and -1 on errors and internal errors. 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyAttrListNoOverwrite(xsltTransformContextPtr ctxt, 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr invocNode, 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr target, xmlAttrPtr attr) 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlAttrPtr copy; 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr origNs = NULL, copyNs = NULL; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value; 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't use xmlCopyProp() here, since it will try to 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * reconciliate namespaces. 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (attr != NULL) { 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find a namespace node in the tree of @target. 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Avoid searching for the same ns. 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attr->ns != origNs) { 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origNs = attr->ns; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attr->ns != NULL) { 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copyNs = xsltGetSpecialNamespace(ctxt, invocNode, 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr->ns->href, attr->ns->prefix, target); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copyNs == NULL) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copyNs = NULL; 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If attribute has a value, we need to copy it (watching out 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for possible entities) 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((attr->children) && (attr->children->type == XML_TEXT_NODE) && 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (attr->children->next == NULL)) { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewNsProp(target, copyNs, attr->name, 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr->children->content); 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (attr->children != NULL) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xmlNodeListGetString(attr->doc, attr->children, 1); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewNsProp(target, copyNs, attr->name, BAD_CAST value); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewNsProp(target, copyNs, attr->name, NULL); 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr = attr->next; 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltShallowCopyElem: 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XSLT process context 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node in the source tree 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or the Literal Result Element 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @insert: the parent in the result tree 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @isLRE: if @node is a Literal Result Element 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make a copy of the element node @node 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and insert it as last child of @insert. 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * URGENT TODO: The problem with this one (for the non-refactored code) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is that it is used for both, Literal Result Elements *and* 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copying input nodes. 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BIG NOTE: This is only called for XML_ELEMENT_NODEs. 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called from: 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplySequenceConstructor() 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (for Literal Result Elements - which is a problem) 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopy() (for shallow-copying elements via xsl:copy) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new node, or NULL in case of error 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltShallowCopyElem(xsltTransformContextPtr ctxt, xmlNodePtr node, 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr insert, int isLRE) 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy; 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type == XML_DTD_NODE) || (insert == NULL)) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node->type == XML_TEXT_NODE) || 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->type == XML_CDATA_SECTION_NODE)) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltCopyText(ctxt, insert, node, 0)); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlDocCopyNode(node, insert->doc, 0); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy != NULL) { 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->doc = ctxt->output; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(insert, copy); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_ELEMENT_NODE) { 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add namespaces as they are needed 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->nsDef != NULL) { 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Remove the LRE case in the refactored code 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * gets enabled. 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isLRE) 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyNamespaceList(ctxt, copy, node->nsDef); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyNamespaceListInternal(copy, node->nsDef); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * URGENT TODO: The problem with this is that it does not 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy over all namespace nodes in scope. 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The damn thing about this is, that we would need to 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use the xmlGetNsList(), for every single node; this is 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * also done in xsltCopyTreeInternal(), but only for the top node. 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns != NULL) { 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isLRE) { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT TODO: Since the non-refactored code still does 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ns-aliasing, we need to call xsltGetNamespace() here. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove this when ready. 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->ns = xsltGetNamespace(ctxt, node, node->ns, copy); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->ns = xsltGetSpecialNamespace(ctxt, 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node, node->ns->href, node->ns->prefix, copy); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((insert->type == XML_ELEMENT_NODE) && 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (insert->ns != NULL)) 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Undeclare" the default namespace. 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetSpecialNamespace(ctxt, node, NULL, NULL, copy); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, node, 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltShallowCopyElem: copy %s failed\n", node->name); 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(copy); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyTreeList: 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @invocNode: responsible node in the stylesheet; used for error reports 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list: the list of element nodes in the source tree. 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @insert: the parent in the result tree. 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @isLRE: is this a literal result element list 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @topElemVisited: indicates if a top-most element was already processed 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make a copy of the full list of tree @list 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and insert it as last children of @insert 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: Not to be used for Literal Result Elements. 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used by: 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - xsltCopyOf() 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new list, or NULL in case of error 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyTreeList(xsltTransformContextPtr ctxt, xmlNodePtr invocNode, 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr list, 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr insert, int isLRE, int topElemVisited) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy, ret = NULL; 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (list != NULL) { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyTreeInternal(ctxt, invocNode, 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list, insert, isLRE, topElemVisited); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy != NULL) { 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = copy; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = list->next; 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyNamespaceListInternal: 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the target node 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the first namespace 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do a copy of a namespace list. If @node is non-NULL the 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * new namespaces are added automatically. 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called by: 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyTreeInternal() 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * QUESTION: What is the exact difference between this function 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and xsltCopyNamespaceList() in "namespaces.c"? 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANSWER: xsltCopyNamespaceList() tries to apply ns-aliases. 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: a new xmlNsPtr, or NULL in case of error. 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyNamespaceListInternal(xmlNodePtr elem, xmlNsPtr ns) { 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ret = NULL; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr p = NULL, q, luNs; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * One can add namespaces only on element nodes 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((elem != NULL) && (elem->type != XML_ELEMENT_NODE)) 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elem = NULL; 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->type != XML_NAMESPACE_DECL) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Avoid duplicating namespace declarations on the tree. 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elem != NULL) { 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((elem->ns != NULL) && 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrEqual(elem->ns->prefix, ns->prefix) && 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrEqual(elem->ns->href, ns->href)) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) luNs = xmlSearchNs(elem->doc, elem, ns->prefix); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((luNs != NULL) && (xmlStrEqual(luNs->href, ns->href))) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) q = xmlNewNs(elem, ns->href, ns->prefix); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (p == NULL) { 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = p = q; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (q != NULL) { 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p->next = q; 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p = q; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ns->next; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (ns != NULL); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltShallowCopyNsNode: 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XSLT transformation context 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @invocNode: responsible node in the stylesheet; used for error reports 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @insert: the target element node in the result tree 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ns: the namespace node 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is used for copying ns-nodes with xsl:copy-of and xsl:copy. 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a new/existing ns-node, or NULL. 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNsPtr 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltShallowCopyNsNode(xsltTransformContextPtr ctxt, 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr invocNode, 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr insert, 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Contrary to header comments, this is declared as int. 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be modified to return a node pointer, or NULL if any error 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr tmpns; 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((insert == NULL) || (insert->type != XML_ELEMENT_NODE)) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (insert->children != NULL) { 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, invocNode, 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Namespace nodes must be added before " 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "any child nodes are added to an element.\n"); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BIG NOTE: Xalan-J simply overwrites any ns-decls with 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an equal prefix. We definitively won't do that. 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MSXML 4.0 and the .NET ignores ns-decls for which an 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * equal prefix is already in use. 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Saxon raises an error like: 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "net.sf.saxon.xpath.DynamicError: Cannot create two namespace 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nodes with the same name". 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: We'll currently follow MSXML here. 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT TODO: Check if it's better to follow Saxon here. 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns->prefix == NULL) { 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If we are adding ns-nodes to an element using e.g. 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <xsl:copy-of select="/foo/namespace::*">, then we need 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to ensure that we don't incorrectly declare a default 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * namespace on an element in no namespace, which otherwise 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * would move the element incorrectly into a namespace, if 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the node tree is serialized. 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (insert->ns == NULL) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto occupied; 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((ns->prefix[0] == 'x') && 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrEqual(ns->prefix, BAD_CAST "xml")) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The XML namespace is built in. 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (insert->nsDef != NULL) { 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpns = insert->nsDef; 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmpns->prefix == NULL) == (ns->prefix == NULL)) { 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmpns->prefix == ns->prefix) || 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlStrEqual(tmpns->prefix, ns->prefix)) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Same prefix. 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(tmpns->href, ns->href)) 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto occupied; 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpns = tmpns->next; 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (tmpns != NULL); 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpns = xmlSearchNs(insert->doc, insert, ns->prefix); 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmpns != NULL) && xmlStrEqual(tmpns->href, ns->href)) 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Declare a new namespace. 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: The problem (wrt efficiency) with this xmlNewNs() is 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * that it will again search the already declared namespaces 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for a duplicate :-/ 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xmlNewNs(insert, ns->href, ns->prefix)); 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)occupied: 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: We could as well raise an error here (like Saxon does), 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or at least generate a warning. 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyTreeInternal: 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XSLT transformation context 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @invocNode: responsible node in the stylesheet; used for error reports 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node in the source tree 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @insert: the parent in the result tree 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @isLRE: indicates if @node is a Literal Result Element 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @topElemVisited: indicates if a top-most element was already processed 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make a copy of the full tree under the element node @node 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and insert it as last child of @insert 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: Not to be used for Literal Result Elements. 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Used by: 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - xsltCopyOf() 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new tree, or NULL in case of error 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyTreeInternal(xsltTransformContextPtr ctxt, 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr invocNode, 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node, 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr insert, int isLRE, int topElemVisited) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node == NULL) 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_REF_NODE: 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_NODE: 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef LIBXML_DOCB_ENABLED 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCB_DOCUMENT_NODE: 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: { 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int noenc = (node->name == xmlStringTextNoenc); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltCopyTextString(ctxt, insert, node->content, noenc)); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltCopyTextString(ctxt, insert, node->content, 0)); 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return((xmlNodePtr) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltShallowCopyAttr(ctxt, invocNode, insert, (xmlAttrPtr) node)); 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return((xmlNodePtr) xsltShallowCopyNsNode(ctxt, invocNode, 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) insert, (xmlNsPtr) node)); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_TYPE_NODE: 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_FRAG_NODE: 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NOTATION_NODE: 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_DECL: 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_DECL: 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ENTITY_DECL: 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_START: 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_XINCLUDE_END: 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (XSLT_IS_RES_TREE_FRAG(node)) { 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyTreeList(ctxt, invocNode, 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->children, insert, 0, 0); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = NULL; 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(copy); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlDocCopyNode(node, insert->doc, 0); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy != NULL) { 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->doc = ctxt->output; 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(insert, copy); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The node may have been coalesced into another text node. 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (insert->last != copy) 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(insert->last); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->next = NULL; 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_ELEMENT_NODE) { 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy in-scope namespace nodes. 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT: Since we try to reuse existing in-scope ns-decls by 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * using xmlSearchNsByHref(), this will eventually change 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the prefix of an original ns-binding; thus it might 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * break QNames in element/attribute content. 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OPTIMIZE TODO: If we had a xmlNsPtr * on the transformation 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * context, plus a ns-lookup function, which writes directly 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to a given list, then we wouldn't need to create/free the 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * nsList every time. 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((topElemVisited == 0) && 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->parent != NULL) && 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->parent->type != XML_DOCUMENT_NODE) && 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (node->parent->type != XML_HTML_DOCUMENT_NODE)) 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr *nsList, *curns, ns; 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If this is a top-most element in a tree to be 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copied, then we need to ensure that all in-scope 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * namespaces are copied over. For nodes deeper in the 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * tree, it is sufficient to reconcile only the ns-decls 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (node->nsDef entries). 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nsList = xmlGetNsList(node->doc, node); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nsList != NULL) { 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curns = nsList; 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search by prefix first in order to break as less 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * QNames in element/attribute content as possible. 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlSearchNs(insert->doc, insert, 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*curns)->prefix); 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ns == NULL) || 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (! xmlStrEqual(ns->href, (*curns)->href))) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = NULL; 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search by namespace name. 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT TODO: Currently disabled. 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlSearchNsByHref(insert->doc, 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) insert, (*curns)->href); 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Declare a new namespace on the copied element. 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlNewNs(copy, (*curns)->href, 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*curns)->prefix); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: Handle errors */ 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns == *curns) { 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If this was the original's namespace then set 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the generated counterpart on the copy. 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->ns = ns; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curns++; 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (*curns != NULL); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(nsList); 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (node->nsDef != NULL) { 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy over all namespace declaration attributes. 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->nsDef != NULL) { 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (isLRE) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyNamespaceList(ctxt, copy, node->nsDef); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyNamespaceListInternal(copy, node->nsDef); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the namespace. 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns != NULL) { 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy->ns == NULL) { 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This will map copy->ns to one of the newly created 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in-scope ns-decls, OR create a new ns-decl on @copy. 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->ns = xsltGetSpecialNamespace(ctxt, invocNode, 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->ns->href, node->ns->prefix, copy); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((insert->type == XML_ELEMENT_NODE) && 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (insert->ns != NULL)) 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Undeclare" the default namespace on @copy with xmlns="". 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetSpecialNamespace(ctxt, invocNode, NULL, NULL, copy); 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy attribute nodes. 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->properties != NULL) { 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyAttrListNoOverwrite(ctxt, invocNode, 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy, node->properties); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (topElemVisited == 0) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) topElemVisited = 1; 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy the subtree. 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->children != NULL) { 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyTreeList(ctxt, invocNode, 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->children, copy, isLRE, topElemVisited); 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, invocNode, 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyTreeInternal: Copying of '%s' failed.\n", node->name); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(copy); 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyTree: 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XSLT transformation context 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the element node in the source tree 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @insert: the parent in the result tree 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @literal: indicates if @node is a Literal Result Element 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make a copy of the full tree under the element node @node 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and insert it as last child of @insert 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For literal result element, some of the namespaces may not be copied 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * over according to section 7.1. 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Why is this a public function? 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new tree, or NULL in case of error 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlNodePtr 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyTree(xsltTransformContextPtr ctxt, xmlNodePtr node, 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr insert, int literal) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltCopyTreeInternal(ctxt, node, node, insert, literal, 0)); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Error/fallback processing * 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyFallbacks: 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the node generating the error 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process possible xsl:fallback nodes present under @inst 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of xsl:fallback element found and processed 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyFallbacks(xsltTransformContextPtr ctxt, xmlNodePtr node, 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst) { 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = 0; 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL) || (inst == NULL) || 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (inst->children == NULL)) 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = inst->children; 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((IS_XSLT_ELEM(child)) && 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(child->name, BAD_CAST "fallback"))) { 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PARSING 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "applying xsl:fallback\n"); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret++; 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, node, child->children, 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Default processing * 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltDefaultProcessOneNode: 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: extra parameters passed to the template if any 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the source node with the default built-in template rule: 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <xsl:template match="*|/"> 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <xsl:apply-templates/> 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * </xsl:template> 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <xsl:template match="text()|@*"> 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <xsl:value-of select="."/> 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * </xsl:template> 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note also that namespace declarations are copied directly: 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the built-in template rule is the only template rule that is applied 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for namespace nodes. 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node, 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr params) { 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy; 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr delete = NULL, cur; 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbchild = 0, oldSize; 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int childno = 0, oldPos; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr template; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_STOPPED; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handling of leaves 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy CDATA %s\n", 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->content)); 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyText(ctxt, ctxt->insert, node, 0); 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) { 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, node, 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: cdata copy failed\n"); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->content == NULL) { 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy empty text\n")); 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy text %s\n", 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->content)); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyText(ctxt, ctxt->insert, node, 0); 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) { 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, node, 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: text copy failed\n"); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = node->children; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((cur != NULL) && (cur->type != XML_TEXT_NODE)) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) { 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, node, 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: no text for attribute\n"); 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content == NULL) { 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy empty text\n")); 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy text %s\n", 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyText(ctxt, ctxt->insert, cur, 0); 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) { 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, node, 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: text copy failed\n"); 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handling of Elements: first pass, cleanup and counting 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = node->children; 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (cur->type) { 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbchild++; 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Unlink the DTD, it's still reachable using doc->intSubset */ 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->next->prev = cur->prev; 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->prev != NULL) 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->prev->next = cur->next; 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: skipping node type %d\n", 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type)); 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete != NULL) { 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: removing ignorable blank node\n")); 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(delete); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(delete); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = NULL; 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete != NULL) { 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: removing ignorable blank node\n")); 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(delete); 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(delete); 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = NULL; 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handling of Elements: second pass, actual processing 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldSize = ctxt->xpathCtxt->contextSize; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldPos = ctxt->xpathCtxt->proximityPosition; 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = node->children; 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) childno++; 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (cur->type) { 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->contextSize = nbchild; 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->proximityPosition = childno; 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltProcessOneNode(ctxt, cur, params); 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template = xsltGetTemplate(ctxt, cur, NULL); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (template) { 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: applying template for CDATA %s\n", 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Instantiate the xsl:template. 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyXSLTTemplate(ctxt, cur, template->content, 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template, params); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else /* if (ctxt->mode == NULL) */ { 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy CDATA %s\n", 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyText(ctxt, ctxt->insert, cur, 0); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) { 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: cdata copy failed\n"); 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template = xsltGetTemplate(ctxt, cur, NULL); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (template) { 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: applying template for text %s\n", 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->contextSize = nbchild; 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->proximityPosition = childno; 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Instantiate the xsl:template. 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyXSLTTemplate(ctxt, cur, template->content, 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template, params); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else /* if (ctxt->mode == NULL) */ { 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->content == NULL) { 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy empty text\n")); 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: copy text %s\n", 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyText(ctxt, ctxt->insert, cur, 0); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) { 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: text copy failed\n"); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template = xsltGetTemplate(ctxt, cur, NULL); 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (template) { 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_PI_NODE) { 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: template found for PI %s\n", 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name)); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_COMMENT_NODE) { 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDefaultProcessOneNode: template found for comment\n")); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->contextSize = nbchild; 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->proximityPosition = childno; 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Instantiate the xsl:template. 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyXSLTTemplate(ctxt, cur, template->content, 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template, params); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->contextSize = oldSize; 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->proximityPosition = oldPos; 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltProcessOneNode: 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @contextNode: the "current node" in the source tree 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @withParams: extra parameters (e.g. xsl:with-param) passed to the 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * template if any 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the source node. 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr withParams) 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ; 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldNode; 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ = xsltGetTemplate(ctxt, contextNode, NULL); 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If no template is found, apply the default rule. 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (templ == NULL) { 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contextNode->type == XML_DOCUMENT_NODE) { 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessOneNode: no template found for /\n")); 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (contextNode->type == XML_CDATA_SECTION_NODE) { 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessOneNode: no template found for CDATA\n")); 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (contextNode->type == XML_ATTRIBUTE_NODE) { 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessOneNode: no template found for attribute %s\n", 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((xmlAttrPtr) contextNode)->name)); 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessOneNode: no template found for %s\n", contextNode->name)); 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldNode = ctxt->node; 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = contextNode; 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDefaultProcessOneNode(ctxt, contextNode, withParams); 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = oldNode; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contextNode->type == XML_ATTRIBUTE_NODE) { 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr oldCurTempRule = ctxt->currentTemplateRule; 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the "current template rule". 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = templ; 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessOneNode: applying template '%s' for attribute %s\n", 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ->match, contextNode->name)); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyXSLTTemplate(ctxt, contextNode, templ->content, templ, withParams); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = oldCurTempRule; 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr oldCurTempRule = ctxt->currentTemplateRule; 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the "current template rule". 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = templ; 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (contextNode->type == XML_DOCUMENT_NODE) { 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessOneNode: applying template '%s' for /\n", 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ->match)); 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessOneNode: applying template '%s' for %s\n", 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ->match, contextNode->name)); 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyXSLTTemplate(ctxt, contextNode, templ->content, templ, withParams); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = oldCurTempRule; 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlNodePtr 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltDebuggerStartSequenceConstructor(xsltTransformContextPtr ctxt, 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr contextNode, 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr list, 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ, 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int *addCallResult) 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr debugedNode = NULL; 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->debugStatus != XSLT_DEBUG_NONE) { 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (templ) { 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *addCallResult = xslAddCall(templ, templ->elem); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *addCallResult = xslAddCall(NULL, list); 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ctxt->debugStatus) { 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_DEBUG_RUN_RESTART: 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_DEBUG_QUIT: 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*addCallResult) 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslDropCall(); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (templ) { 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(templ->elem, contextNode, templ, ctxt); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debugedNode = templ->elem; 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (list) { 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(list, contextNode, templ, ctxt); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debugedNode = list; 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ctxt->inst) { 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(ctxt->inst, contextNode, templ, ctxt); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debugedNode = ctxt->inst; 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(debugedNode); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltLocalVariablePush: 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the transformation context 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @variable: variable to be pushed to the variable stack 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @level: new value for variable's level 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Places the variable onto the local variable stack 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns: 0 for success, -1 for any error 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * **NOTE:** 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is an internal routine and should not be called by users! 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltLocalVariablePush(xsltTransformContextPtr ctxt, 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr variable, 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int level) 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsMax == 0) { 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsMax = 10; 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsTab = 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltStackElemPtr *) xmlMalloc(ctxt->varsMax * 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->varsTab[0])); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsTab == NULL) { 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "malloc failed !\n"); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsNr >= ctxt->varsMax) { 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsMax *= 2; 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsTab = 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltStackElemPtr *) xmlRealloc(ctxt->varsTab, 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsMax * 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(ctxt->varsTab[0])); 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsTab == NULL) { 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlGenericError(xmlGenericErrorContext, "realloc failed !\n"); 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsTab[ctxt->varsNr++] = variable; 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->vars = variable; 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variable->level = level; 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltReleaseLocalRVTs: 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fragments which are results of extension instructions 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are preserved; all other fragments are freed/cached. 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltReleaseLocalRVTs(xsltTransformContextPtr ctxt, xmlDocPtr base) 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr cur = ctxt->localRVT, tmp; 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((cur != NULL) && (cur != base)) { 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->psvi == (void *) ((long) 1)) { 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = (xmlDocPtr) cur->next; 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = cur; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = (xmlDocPtr) cur->next; 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == ctxt->localRVT) 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVT = cur; 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We need ctxt->localRVTBase for extension instructions 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which return values (like EXSLT's function). 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == ctxt->localRVTBase) 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = cur; 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->prev) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->prev->next = (xmlNodePtr) cur; 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur) 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->prev = tmp->prev; 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseRVT(ctxt, tmp); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplySequenceConstructor: 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @contextNode: the "current node" in the source tree 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list: the nodes of a sequence constructor; 21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (plus leading xsl:param elements) 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @templ: the compiled xsl:template (optional) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Processes a sequence constructor. 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: ctxt->currentTemplateRule was introduced to reflect the 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * semantics of "current template rule". I.e. the field ctxt->templ 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is not intended to reflect this, thus always pushed onto the 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * template stack. 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplySequenceConstructor(xsltTransformContextPtr ctxt, 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr contextNode, xmlNodePtr list, 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ) 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldInsert, oldInst, oldCurInst, oldContextNode; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, insert, copy = NULL; 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int level = 0, oldVarsNr; 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldLocalFragmentTop, oldLocalFragmentBase; 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr info; 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addCallResult = 0; 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr debuggedNode = NULL; 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->debugStatus != XSLT_DEBUG_NONE) { 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) debuggedNode = 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDebuggerStartSequenceConstructor(ctxt, contextNode, 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list, templ, &addCallResult); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (debuggedNode == NULL) 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_STOPPED; 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldLocalFragmentTop = ctxt->localRVT; 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldInsert = insert = ctxt->insert; 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldInst = oldCurInst = ctxt->inst; 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldContextNode = ctxt->node; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Save current number of variables on the stack; new vars are popped when 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * exiting. 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldVarsNr = ctxt->varsNr; 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the sequence constructor. 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list; 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = cur; 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ctxt->debugStatus) { 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_DEBUG_RUN_RESTART: 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_DEBUG_QUIT: 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Test; we must have a valid insertion point. 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (insert == NULL) { 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: insert == NULL !\n")); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->debugStatus != XSLT_DEBUG_NONE) && (debuggedNode != cur)) 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(cur, contextNode, templ, ctxt); 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_ELEMENT_NODE) { 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info = (xsltStylePreCompPtr) cur->psvi; 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We expect a compiled representation on: 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1) XSLT instructions of this XSLT version (1.0) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (with a few exceptions) 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2) Literal result elements 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3) Extension instructions 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4) XSLT instructions of future XSLT versions 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (forwards-compatible mode). 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info == NULL) { 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle the rare cases where we don't expect a compiled 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * representation on an XSLT element. 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_ELEM_FAST(cur) && IS_XSLT_NAME(cur, "message")) { 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltMessage(ctxt, contextNode, cur); 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Something really went wrong: 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltApplySequenceConstructor(): " 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The element '%s' in the stylesheet has no compiled " 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "representation.\n", 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info->type == XSLT_FUNC_LITERAL_RESULT_ELEMENT) { 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemLRElementInfoPtr lrInfo = 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltStyleItemLRElementInfoPtr) info; 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Literal result elements 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -------------------------------------------------------- 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt, XSLT_TRACE_APPLY_TEMPLATE, 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: copy literal result " 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "element '%s'\n", cur->name)); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy the raw element-node. 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OLD: if ((copy = xsltShallowCopyElem(ctxt, cur, insert)) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * == NULL) 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * goto error; 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlDocCopyNode(cur, insert->doc, 0); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) { 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltApplySequenceConstructor(): " 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to copy literal result element '%s'.\n", 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name); 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add the element-node to the result tree. 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->doc = ctxt->output; 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(insert, copy); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create effective namespaces declarations. 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OLD: xsltCopyNamespaceList(ctxt, copy, cur->nsDef); 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lrInfo->effectiveNs != NULL) { 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltEffectiveNsPtr effNs = lrInfo->effectiveNs; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns, lastns = NULL; 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (effNs != NULL) { 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Avoid generating redundant namespace 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * declarations; thus lookup if there is already 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * such a ns-decl in the result. 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlSearchNs(copy->doc, copy, effNs->prefix); 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ns != NULL) && 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(ns->href, effNs->nsName))) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effNs = effNs->next; 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlNewNs(copy, effNs->nsName, effNs->prefix); 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in " 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor(): " 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to copy a namespace " 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "declaration.\n"); 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lastns == NULL) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->nsDef = ns; 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastns->next =ns; 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastns = ns; 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effNs = effNs->next; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that we don't need to apply ns-alising: this was 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * already done at compile-time. 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->ns != NULL) { 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If there's no such ns-decl in the result tree, 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * then xsltGetSpecialNamespace() will 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * create a ns-decl on the copied node. 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->ns = xsltGetSpecialNamespace(ctxt, cur, 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->ns->href, cur->ns->prefix, copy); 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Undeclare the default namespace if needed. 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This can be skipped, if the result element has 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * no ns-decls, in which case the result element 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * obviously does not declare a default namespace; 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * AND there's either no parent, or the parent 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element is in no namespace; this means there's no 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * default namespace is scope to care about. 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT: This might result in massive 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * generation of ns-decls if nodes in a default 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * namespaces are mixed with nodes in no namespace. 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy->nsDef || 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((insert != NULL) && 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (insert->type == XML_ELEMENT_NODE) && 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (insert->ns != NULL))) 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetSpecialNamespace(ctxt, cur, 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL, copy); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPEC XSLT 2.0 "Each attribute of the literal result 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element, other than an attribute in the XSLT namespace, 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is processed to produce an attribute for the element in 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the result tree." 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: See bug #341325. 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->properties != NULL) { 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltAttrListTemplateProcess(ctxt, copy, cur->properties); 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_XSLT_ELEM_FAST(cur)) { 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XSLT instructions 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -------------------------------------------------------- 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info->type == XSLT_FUNC_UNKOWN_FORWARDS_COMPAT) { 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We hit an unknown XSLT element. 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to apply one of the fallback cases. 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = insert; 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xsltApplyFallbacks(ctxt, contextNode, cur)) { 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The is no fallback behaviour defined for " 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "the unknown XSLT element '%s'.\n", 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (info->func != NULL) { 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Execute the XSLT instruction. 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = insert; 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->func(ctxt, contextNode, cur, 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltElemPreCompPtr) info); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup temporary tree fragments. 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldLocalFragmentTop != ctxt->localRVT) 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop); 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (info->type == XSLT_FUNC_VARIABLE) { 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr tmpvar = ctxt->vars; 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltParseStylesheetVariable(ctxt, cur); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmpvar != ctxt->vars) { 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Using a @tmpvar is an annoying workaround, but 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the current mechanisms do not provide any other way 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of knowing if the var was really pushed onto the 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stack. 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->vars->level = level; 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (info->type == XSLT_FUNC_MESSAGE) { 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Won't be hit, since we don't compile xsl:message. 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltMessage(ctxt, contextNode, cur); 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unexpected XSLT element '%s'.\n", cur->name); 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformFunction func; 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Extension intructions (elements) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -------------------------------------------------------- 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->psvi == xsltExtMarker) { 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The xsltExtMarker was set during the compilation 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of extension instructions if there was no registered 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * handler for this specific extension function at 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compile-time. 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Libxslt will now lookup if a handler is 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * registered in the context of this transformation. 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func = (xsltTransformFunction) 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltExtElementLookup(ctxt, cur->name, cur->ns->href); 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func = ((xsltElemPreCompPtr) cur->psvi)->func; 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (func == NULL) { 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No handler available. 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Try to execute fallback behaviour via xsl:fallback. 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt, XSLT_TRACE_APPLY_TEMPLATE, 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: unknown extension %s\n", 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name)); 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = insert; 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xsltApplyFallbacks(ctxt, contextNode, cur)) { 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unknown extension instruction '{%s}%s'.\n", 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->ns->href, cur->name); 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Execute the handler-callback. 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: extension construct %s\n", 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name)); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = insert; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We need the fragment base for extension instructions 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which return values (like EXSLT's function). 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldLocalFragmentBase = ctxt->localRVTBase; 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = NULL; 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func(ctxt, contextNode, cur, cur->psvi); 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = oldLocalFragmentBase; 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup temporary tree fragments. 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldLocalFragmentTop != ctxt->localRVT) 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop); 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (XSLT_IS_TEXT_NODE(cur)) { 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Text 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ------------------------------------------------------------ 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->name == xmlStringTextNoenc) { 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt, XSLT_TRACE_APPLY_TEMPLATE, 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: copy unescaped text '%s'\n", 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt, XSLT_TRACE_APPLY_TEMPLATE, 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: copy text '%s'\n", 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xsltCopyText(ctxt, insert, cur, ctxt->internalized) == NULL) 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* XSLT_REFACTORED */ 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_ELEM(cur)) { 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is an XSLT node 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr info = (xsltStylePreCompPtr) cur->psvi; 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info == NULL) { 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_NAME(cur, "message")) { 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltMessage(ctxt, contextNode, cur); 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * That's an error try to apply one of the fallback cases 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = insert; 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xsltApplyFallbacks(ctxt, contextNode, cur)) { 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericError(xsltGenericErrorContext, 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: %s was not compiled\n", 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (info->func != NULL) { 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldCurInst = ctxt->inst; 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = cur; 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = insert; 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldLocalFragmentBase = ctxt->localRVTBase; 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = NULL; 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->func(ctxt, contextNode, cur, (xsltElemPreCompPtr) info); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = oldLocalFragmentBase; 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup temporary tree fragments. 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldLocalFragmentTop != ctxt->localRVT) 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = oldCurInst; 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_NAME(cur, "variable")) { 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr tmpvar = ctxt->vars; 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldCurInst = ctxt->inst; 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = cur; 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltParseStylesheetVariable(ctxt, cur); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = oldCurInst; 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmpvar != ctxt->vars) { 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Using a @tmpvar is an annoying workaround, but 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the current mechanisms do not provide any other way 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of knowing if the var was really pushed onto the 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stack. 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->vars->level = level; 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (IS_XSLT_NAME(cur, "message")) { 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltMessage(ctxt, contextNode, cur); 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Unexpected XSLT element '%s'.\n", cur->name); 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((cur->type == XML_TEXT_NODE) || 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_CDATA_SECTION_NODE)) { 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This text comes from the stylesheet 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For stylesheets, the set of whitespace-preserving 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element names consists of just xsl:text. 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_CDATA_SECTION_NODE) { 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: copy CDATA text %s\n", 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->name == xmlStringTextNoenc) { 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: copy unescaped text %s\n", 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: copy text %s\n", 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->content)); 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xsltCopyText(ctxt, insert, cur, ctxt->internalized) == NULL) 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((cur->type == XML_ELEMENT_NODE) && 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->ns != NULL) && (cur->psvi != NULL)) { 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformFunction function; 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldCurInst = ctxt->inst; 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = cur; 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Flagged as an extension element 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->psvi == xsltExtMarker) 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function = (xsltTransformFunction) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltExtElementLookup(ctxt, cur->name, cur->ns->href); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function = ((xsltElemPreCompPtr) cur->psvi)->func; 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (function == NULL) { 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr child; 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int found = 0; 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: unknown extension %s\n", 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name)); 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Search if there are fallbacks 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = cur->children; 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (child != NULL) { 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((IS_XSLT_ELEM(child)) && 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (IS_XSLT_NAME(child, "fallback"))) 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = 1; 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, contextNode, 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->children, NULL); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = child->next; 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) { 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: failed to find extension %s\n", 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: extension construct %s\n", 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name)); 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = insert; 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We need the fragment base for extension instructions 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * which return values (like EXSLT's function). 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldLocalFragmentBase = ctxt->localRVTBase; 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = NULL; 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function(ctxt, contextNode, cur, cur->psvi); 27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup temporary tree fragments. 27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldLocalFragmentTop != ctxt->localRVT) 27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop); 27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = oldLocalFragmentBase; 27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = oldCurInst; 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto skip_children; 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_ELEMENT_NODE) { 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplySequenceConstructor: copy node %s\n", 27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->name)); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldCurInst = ctxt->inst; 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = cur; 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((copy = xsltShallowCopyElem(ctxt, cur, insert, 1)) == NULL) 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Add extra namespaces inherited from the current template 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if we are in the first level children and this is a 27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "real" template. 27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((templ != NULL) && (oldInsert == insert) && 27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->templ != NULL) && (ctxt->templ->inheritedNs != NULL)) { 27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns, ret; 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < ctxt->templ->inheritedNsNr; i++) { 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *URI = NULL; 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr style; 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = ctxt->templ->inheritedNs[i]; 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Note that the XSLT namespace was already excluded 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in xsltGetInheritedNsList(). 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(ns->href, XSLT_NAMESPACE)) 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = ctxt->style; 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (style != NULL) { 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->nsAliases != NULL) 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = (const xmlChar *) 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup(style->nsAliases, ns->href); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI != NULL) 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = xsltNextImport(style); 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == UNDEFINED_DEFAULT_NS) 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) 27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = ns->href; 27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: The following will still be buggy for the 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * non-refactored code. 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xmlSearchNs(copy->doc, copy, ns->prefix); 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ret == NULL) || (!xmlStrEqual(ret->href, URI))) 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNewNs(copy, URI, ns->prefix); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy->ns != NULL) { 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Fix the node namespace if needed 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->ns = xsltGetNamespace(ctxt, cur, copy->ns, copy); 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all the attributes are directly inherited 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->properties != NULL) { 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltAttrListTemplateProcess(ctxt, copy, cur->properties); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = oldCurInst; 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* else of XSLT_REFACTORED */ 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Descend into content in document order. 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children != NULL) { 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->children->type != XML_ENTITY_DECL) { 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->children; 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) level++; 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy != NULL) 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) insert = copy; 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)skip_children: 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If xslt:message was just processed, we might have hit a 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * terminate='yes'; if so, then break the loop and clean up. 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Do we need to check this also before trying to descend 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * into the content? 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state == XSLT_STATE_STOPPED) 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) level--; 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop variables/params (xsl:variable and xsl:param). 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->varsNr > oldVarsNr) && (ctxt->vars->level > level)) { 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltLocalVariablePop(ctxt, oldVarsNr, level); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) insert = insert->parent; 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == list->parent) { 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = NULL; 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) { 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In case of errors: pop remaining variables. 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsNr > oldVarsNr) 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltLocalVariablePop(ctxt, oldVarsNr, -1); 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = oldContextNode; 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->inst = oldInst; 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->debugStatus != XSLT_DEBUG_NONE) && (addCallResult)) { 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslDropCall(); 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* xsltApplyXSLTTemplate: 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @ctxt: a XSLT transformation context 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @contextNode: the node in the source tree. 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @list: the nodes of a sequence constructor; 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* (plus leading xsl:param elements) 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @templ: the compiled xsl:template declaration; 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* NULL if a sequence constructor 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* @withParams: a set of caller-parameters (xsl:with-param) or NULL 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* Called by: 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* - xsltApplyImports() 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* - xsltCallTemplate() 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* - xsltDefaultProcessOneNode() 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)* - xsltProcessOneNode() 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/ 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyXSLTTemplate(xsltTransformContextPtr ctxt, 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr contextNode, 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr list, 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ, 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr withParams) 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldVarsBase = 0; 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long start = 0; 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr tmpParam = NULL; 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldUserFragmentTop, oldLocalFragmentTop; 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemParamPtr iparam; 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr iparam; 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int addCallResult = 0; 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (templ == NULL) { 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, list, 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyXSLTTemplate: Bad arguments; @templ is mandatory.\n"); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->debugStatus != XSLT_DEBUG_NONE) { 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xsltDebuggerStartSequenceConstructor(ctxt, contextNode, 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list, templ, &addCallResult) == NULL) 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_STOPPED; 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check for infinite recursion: stop if the maximum of nested templates 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is excceeded. Adjust xsltMaxDepth if you need more. 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((ctxt->templNr >= xsltMaxDepth) || 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->varsNr >= 5 * xsltMaxDepth))) 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, list, 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyXSLTTemplate: A potential infinite template recursion " 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "was detected.\n" 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "You can adjust xsltMaxDepth (--maxdepth) in order to " 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "raise the maximum number of nested template calls and " 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "variables/params (currently set to %d).\n", 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltMaxDepth); 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDebug(ctxt, contextNode, list, NULL); 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldUserFragmentTop = ctxt->tmpRVT; 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->tmpRVT = NULL; 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldLocalFragmentTop = ctxt->localRVT; 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Initiate a distinct scope of local params/variables. 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldVarsBase = ctxt->varsBase; 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsBase = ctxt->varsNr; 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = contextNode; 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profile) { 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ->nbCalls++; 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start = xsltTimestamp(); 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profPush(ctxt, 0); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push the xsl:template declaration onto the stack. 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templPush(ctxt, templ); 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (templ->name != NULL) 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "applying xsl:template '%s'\n", templ->name)); 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process xsl:param instructions and skip those elements for 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * further processing. 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list; 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_TEXT_NODE) { 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_ELEMENT_NODE) || 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->name[0] != 'p') || 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->psvi == NULL) || 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (! xmlStrEqual(cur->name, BAD_CAST "param")) || 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (! IS_XSLT_ELEM(cur))) 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = cur->next; 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iparam = (xsltStyleItemParamPtr) cur->psvi; 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iparam = (xsltStylePreCompPtr) cur->psvi; 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Substitute xsl:param for a given xsl:with-param. 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Since the XPath expression will reference the params/vars 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by index, we need to slot the xsl:with-params in the 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * order of encountered xsl:params to keep the sequence of 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * params/variables in the stack exactly as it was at 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compile time, 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpParam = NULL; 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (withParams) { 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpParam = withParams; 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmpParam->name == (iparam->name)) && 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (tmpParam->nameURI == (iparam->ns))) 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push the caller-parameter. 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltLocalVariablePush(ctxt, tmpParam, -1); 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpParam = tmpParam->next; 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (tmpParam != NULL); 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push the xsl:param. 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmpParam == NULL) { 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that we must assume that the added parameter 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * has a @depth of 0. 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltParseStylesheetParam(ctxt, cur); 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the sequence constructor. 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, contextNode, list, templ); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove remaining xsl:param and xsl:with-param items from 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the stack. Don't free xsl:with-param items. 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->varsNr > ctxt->varsBase) 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplateParamsCleanup(ctxt); 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsBase = oldVarsBase; 30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Clean up remaining local tree fragments. 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This also frees fragments which are the result of 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * extension instructions. Should normally not be hit; but 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * just for the case xsltExtensionInstructionResultFinalize() 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * was not called by the extension author. 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldLocalFragmentTop != ctxt->localRVT) { 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr curdoc = ctxt->localRVT, tmp; 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = curdoc; 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curdoc = (xmlDocPtr) curdoc->next; 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Need to housekeep localRVTBase */ 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == ctxt->localRVTBase) 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVTBase = curdoc; 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->prev) 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp->prev->next = (xmlNodePtr) curdoc; 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (curdoc) 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curdoc->prev = tmp->prev; 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseRVT(ctxt, tmp); 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (curdoc != oldLocalFragmentTop); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->localRVT = oldLocalFragmentTop; 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Release user-created fragments stored in the scope 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of xsl:template. Note that this mechanism is deprecated: 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * user code should now use xsltRegisterLocalRVT() instead 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the obsolete xsltRegisterTmpRVT(). 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->tmpRVT) { 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr curdoc = ctxt->tmpRVT, tmp; 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (curdoc != NULL) { 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = curdoc; 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curdoc = (xmlDocPtr) curdoc->next; 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseRVT(ctxt, tmp); 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->tmpRVT = oldUserFragmentTop; 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop the xsl:template declaration from the stack. 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templPop(ctxt); 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profile) { 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long spent, child, total, end; 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = xsltTimestamp(); 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child = profPop(ctxt); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total = end - start; 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spent = total - child; 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (spent <= 0) { 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Not possible unless the original calibration failed 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * we can try to correct it on the fly. 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCalibrateAdjust(spent); 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) spent = 0; 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ->time += spent; 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->profNr > 0) 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profTab[ctxt->profNr - 1] += total; 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->debugStatus != XSLT_DEBUG_NONE) && (addCallResult)) { 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslDropCall(); 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyOneTemplate: 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @contextNode: the node in the source tree. 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @list: the nodes of a sequence constructor 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @templ: not used 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: a set of parameters (xsl:param) or NULL 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Processes a sequence constructor on the current node in the source tree. 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params are the already computed variable stack items; this function 31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * pushes them on the variable stack, and pops them before exiting; it's 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * left to the caller to free or reuse @params afterwards. The initial 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * states of the variable stack will always be restored before this 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function exits. 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that this does *not* initiate a new distinct variable scope; i.e. 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * variables already on the stack are visible to the process. The caller's 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * side needs to start a new variable scope if needed (e.g. in exsl:function). 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @templ is obsolete and not used anymore (e.g. <exslt:function> does not 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * provide a @templ); a non-NULL @templ might raise an error in the future. 31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BIG NOTE: This function is not intended to process the content of an 31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsl:template; it does not expect xsl:param instructions in @list and 31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * will report errors if found. 31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called by: 31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - xsltEvalVariable() (variables.c) 31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * - exsltFuncFunctionFunction() (libexsl/functions.c) 31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyOneTemplate(xsltTransformContextPtr ctxt, 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr contextNode, 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr list, 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ ATTRIBUTE_UNUSED, 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr params) 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (list == NULL)) 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK_STOPPED; 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params) { 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This code should be obsolete - was previously used 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by libexslt/functions.c, but due to bug 381319 the 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * logic there was changed. 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldVarsNr = ctxt->varsNr; 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Push the given xsl:param(s) onto the variable stack. 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (params != NULL) { 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltLocalVariablePush(ctxt, params, -1); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params = params->next; 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, contextNode, list, templ); 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Pop the given xsl:param(s) from the stack but don't free them. 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltLocalVariablePop(ctxt, oldVarsNr, -2); 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, contextNode, list, templ); 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XSLT-1.1 extensions * 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltDocumentElem: 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT processing context 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: The current node 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the instruction in the stylesheet 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: precomputed information 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process an EXSLT/XSLT-1.1 document element 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltDocumentElem(xsltTransformContextPtr ctxt, xmlNodePtr node, 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemDocumentPtr comp = (xsltStyleItemDocumentPtr) castedComp; 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr style = NULL; 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *filename = NULL, *prop, *elements; 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *element, *end; 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr res = NULL; 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldOutput; 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldInsert, root; 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *oldOutputFile; 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltOutputType oldType; 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URL = NULL; 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *method; 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *doctypePublic; 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *doctypeSystem; 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *version; 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *encoding; 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL) || (inst == NULL) || (comp == NULL)) 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->filename == NULL) { 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(inst->name, (const xmlChar *) "output")) { 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The element "output" is in the namespace XSLT_SAXON_NAMESPACE 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (http://icl.com/saxon) 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The @file is in no namespace. 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_EXTRA 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found saxon:output extension\n"); 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xsltEvalAttrValueTemplate(ctxt, inst, 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "file", 32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_SAXON_NAMESPACE); 32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) 32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xsltEvalAttrValueTemplate(ctxt, inst, 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "href", 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_SAXON_NAMESPACE); 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(inst->name, (const xmlChar *) "write")) { 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_EXTRA 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Found xalan:write extension\n"); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xsltEvalAttrValueTemplate(ctxt, inst, 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "select", 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_XALAN_NAMESPACE); 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL != NULL) { 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathCompExprPtr cmp; 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *val; 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Trying to handle bug #59212 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The value of the "select" attribute is an 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XPath expression. 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (see http://xml.apache.org/xalan-j/extensionslib.html#redirect) 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmp = xmlXPathCompile(URL); 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = xsltEvalXPathString(ctxt, cmp); 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeCompExpr(cmp); 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = val; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xsltEvalAttrValueTemplate(ctxt, inst, 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "file", 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_XALAN_NAMESPACE); 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xsltEvalAttrValueTemplate(ctxt, inst, 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "href", 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_XALAN_NAMESPACE); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(inst->name, (const xmlChar *) "document")) { 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xsltEvalAttrValueTemplate(ctxt, inst, 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "href", 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL = xmlStrdup(comp->filename); 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL == NULL) { 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDocumentElem: href/URI-Reference not found\n"); 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the computation failed, it's likely that the URL wasn't escaped 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename = xmlBuildURI(URL, (const xmlChar *) ctxt->outputFile); 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == NULL) { 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *escURL; 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) escURL=xmlURIEscapeStr(URL, BAD_CAST ":/.?,"); 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (escURL != NULL) { 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename = xmlBuildURI(escURL, (const xmlChar *) ctxt->outputFile); 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(escURL); 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename == NULL) { 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDocumentElem: URL computation failed for %s\n", 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL); 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Security checking: can we write to this resource 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->sec != NULL) { 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltCheckWrite(ctxt->sec, ctxt, filename); 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDocumentElem: write rights for %s denied\n", 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename); 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(filename); 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldOutputFile = ctxt->outputFile; 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldOutput = ctxt->output; 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldInsert = ctxt->insert; 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldType = ctxt->type; 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->outputFile = (const char *) filename; 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = xsltNewStylesheet(); 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style == NULL) { 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDocumentElem: out of memory\n"); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Version described in 1.1 draft allows full parameterization 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the output. 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "version", 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->version != NULL) 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(style->version); 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->version = prop; 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "encoding", 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->encoding != NULL) 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(style->encoding); 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->encoding = prop; 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "method", 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *URI; 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->method != NULL) 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(style->method); 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->method = NULL; 33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->methodURI != NULL) 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(style->methodURI); 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->methodURI = NULL; 33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xsltGetQNameURI(inst, &prop); 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop == NULL) { 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style != NULL) style->errors++; 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (URI == NULL) { 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((xmlStrEqual(prop, (const xmlChar *) "xml")) || 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(prop, (const xmlChar *) "html")) || 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(prop, (const xmlChar *) "text"))) { 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->method = prop; 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value for method: %s\n", prop); 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style != NULL) style->warnings++; 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->method = prop; 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->methodURI = xmlStrdup(URI); 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "doctype-system", NULL); 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->doctypeSystem != NULL) 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(style->doctypeSystem); 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->doctypeSystem = prop; 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "doctype-public", NULL); 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->doctypePublic != NULL) 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(style->doctypePublic); 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->doctypePublic = prop; 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "standalone", 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(prop, (const xmlChar *) "yes")) { 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->standalone = 1; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(prop, (const xmlChar *) "no")) { 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->standalone = 0; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value for standalone: %s\n", 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop); 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style != NULL) style->warnings++; 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prop); 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "indent", 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(prop, (const xmlChar *) "yes")) { 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->indent = 1; 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(prop, (const xmlChar *) "no")) { 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->indent = 0; 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value for indent: %s\n", prop); 34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style != NULL) style->warnings++; 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prop); 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "omit-xml-declaration", 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop != NULL) { 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(prop, (const xmlChar *) "yes")) { 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->omitXmlDeclaration = 1; 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(prop, (const xmlChar *) "no")) { 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->omitXmlDeclaration = 0; 34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "invalid value for omit-xml-declaration: %s\n", 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop); 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style != NULL) style->warnings++; 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prop); 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements = xsltEvalAttrValueTemplate(ctxt, inst, 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "cdata-section-elements", 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (elements != NULL) { 34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->stripSpaces == NULL) 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->stripSpaces = xmlHashCreate(10); 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->stripSpaces == NULL) 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = elements; 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (*element != 0) { 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_BLANK_CH(*element)) 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element++; 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*element == 0) 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end = element; 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((*end != 0) && (!IS_BLANK_CH(*end))) 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end++; 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = xmlStrndup(element, end - element); 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (element) { 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *URI; 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PARSING 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "add cdata section output element %s\n", 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element); 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xsltGetQNameURI(inst, &element); 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashAddEntry2(style->stripSpaces, element, URI, 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlChar *) "cdata"); 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(element); 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = end; 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(elements); 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new document tree and process the element template 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(method, style, method) 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypePublic, style, doctypePublic) 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypeSystem, style, doctypeSystem) 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(version, style, version) 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(encoding, style, encoding) 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((method != NULL) && 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(method, (const xmlChar *) "xml"))) { 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(method, (const xmlChar *) "html")) { 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_HTML; 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = htmlNewDoc(doctypeSystem, doctypePublic); 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (version != NULL) { 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_GENERATE_HTML_DOCTYPE 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetHTMLIDs(version, &doctypePublic, &doctypeSystem); 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = htmlNewDocNoDtD(doctypeSystem, doctypePublic); 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(res->dict); 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(method, (const xmlChar *) "xhtml")) { 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDocumentElem: unsupported method xhtml\n", 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->method); 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_HTML; 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = htmlNewDocNoDtD(doctypeSystem, doctypePublic); 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(res->dict); 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(method, (const xmlChar *) "text")) { 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_TEXT; 35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlNewDoc(style->version); 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(res->dict); 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "reusing transformation dict for output\n"); 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDocumentElem: unsupported method %s\n", 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->method); 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_XML; 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlNewDoc(style->version); 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(res->dict); 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "reusing transformation dict for output\n"); 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->charset = XML_CHAR_ENCODING_UTF8; 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encoding != NULL) 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->encoding = xmlStrdup(encoding); 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->output = res; 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = (xmlNodePtr) res; 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, node, inst->children, NULL); 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do some post processing work depending on the generated output 35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(res); 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root != NULL) { 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *doctype = NULL; 35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((root->ns != NULL) && (root->ns->prefix != NULL)) 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctype = xmlDictQLookup(ctxt->dict, root->ns->prefix, root->name); 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doctype == NULL) 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctype = root->name; 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the default selection of the method 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((method == NULL) && 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (root->ns == NULL) && 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrcasecmp(root->name, (const xmlChar *) "html"))) { 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp; 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = res->children; 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((tmp != NULL) && (tmp != root)) { 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->type == XML_ELEMENT_NODE) 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmp->type == XML_TEXT_NODE) && (!xmlIsBlankNode(tmp))) 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == root) { 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_HTML; 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->type = XML_HTML_DOCUMENT_NODE; 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) { 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->intSubset = xmlCreateIntSubset(res, doctype, 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypePublic, 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypeSystem); 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_GENERATE_HTML_DOCTYPE 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (version != NULL) { 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetHTMLIDs(version, &doctypePublic, 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &doctypeSystem); 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->intSubset = 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCreateIntSubset(res, doctype, 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypePublic, 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypeSystem); 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->type == XSLT_OUTPUT_XML) { 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypePublic, style, doctypePublic) 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypeSystem, style, doctypeSystem) 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->intSubset = xmlCreateIntSubset(res, doctype, 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypePublic, 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypeSystem); 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Save the result 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltSaveResultToFilename((const char *) filename, 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res, style, 0); 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) { 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltDocumentElem: unable to save to %s\n", 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filename); 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_ERROR; 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_EXTRA 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Wrote %d bytes to %s\n", ret, filename); 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error: 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->output = oldOutput; 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = oldType; 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->outputFile = oldOutputFile; 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URL != NULL) 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URL); 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filename != NULL) 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(filename); 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style != NULL) 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeStylesheet(style); 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(res); 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Most of the XSLT-1.0 transformations * 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltSort: 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xslt sort node 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @comp: precomputed information 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function attached to xsl:sort nodes, but this should not be 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called directly 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSort(xsltTransformContextPtr ctxt, 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr inst, 36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp) { 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp == NULL) { 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:sort : compilation failed\n"); 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:sort : improper use this should not be reached\n"); 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopy: 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT process context 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the element node of the XSLT-copy instruction 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: computed information of the XSLT-copy instruction 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Execute the XSLT-copy instruction on the source node. 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopy(xsltTransformContextPtr ctxt, xmlNodePtr node, 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemCopyPtr comp = (xsltStyleItemCopyPtr) castedComp; 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy, oldInsert; 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldInsert = ctxt->insert; 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->insert != NULL) { 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This text comes from the stylesheet 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For stylesheets, the set of whitespace-preserving 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * element names consists of just xsl:text. 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_CDATA_SECTION_NODE) { 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY,xsltGenericDebug(xsltGenericDebugContext, 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopy: CDATA text %s\n", node->content)); 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY,xsltGenericDebug(xsltGenericDebugContext, 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopy: text %s\n", node->content)); 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyText(ctxt, ctxt->insert, node, 0); 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT NOTE: The "fake" is a doc-node, not an element node. 37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REMOVED: 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if (xmlStrEqual(node->name, BAD_CAST " fake node libxslt")) 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * return; 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY,xsltGenericDebug(xsltGenericDebugContext, 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopy: node %s\n", node->name)); 37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltShallowCopyElem(ctxt, node, ctxt->insert, 0); 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = copy; 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->use != NULL) { 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyAttributeSet(ctxt, node, inst, comp->use); 37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ATTRIBUTE_NODE: { 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY,xsltGenericDebug(xsltGenericDebugContext, 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopy: attribute %s\n", node->name)); 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT: We could also raise an error if the parent is not 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an element node. 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OPTIMIZE TODO: Can we set the value/children of the 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attribute without an intermediate copy of the string value? 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltShallowCopyAttr(ctxt, inst, ctxt->insert, (xmlAttrPtr) node); 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY,xsltGenericDebug(xsltGenericDebugContext, 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopy: PI %s\n", node->name)); 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewDocPI(ctxt->insert->doc, node->name, 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->content); 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(ctxt->insert, copy); 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY,xsltGenericDebug(xsltGenericDebugContext, 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopy: comment\n")); 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewComment(node->content); 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(ctxt->insert, copy); 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_NAMESPACE_DECL: 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY,xsltGenericDebug(xsltGenericDebugContext, 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopy: namespace declaration\n")); 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltShallowCopyNsNode(ctxt, inst, ctxt->insert, (xmlNsPtr)node); 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (node->type) { 38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, ctxt->node, inst->children, 38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltText: 38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xslt text node 38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @comp: precomputed information 38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the xslt text node on the source node 38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltText(xsltTransformContextPtr ctxt, xmlNodePtr node ATTRIBUTE_UNUSED, 38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr comp ATTRIBUTE_UNUSED) { 38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((inst->children != NULL) && (comp != NULL)) { 38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr text = inst->children; 38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy; 38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (text != NULL) { 38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((text->type != XML_TEXT_NODE) && 38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (text->type != XML_CDATA_SECTION_NODE)) { 38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:text content problem\n"); 38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewDocText(ctxt->output, text->content); 38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (text->type != XML_CDATA_SECTION_NODE) { 38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PARSING 38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Disable escaping: %s\n", text->content); 38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->name = xmlStringTextNoenc; 38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(ctxt->insert, copy); 38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text = text->next; 38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltElement: 38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xslt element node 38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: precomputed information 38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the xslt element node on the source node 38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltElement(xsltTransformContextPtr ctxt, xmlNodePtr node, 38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) { 38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemElementPtr comp = (xsltStyleItemElementPtr) castedComp; 38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *prop = NULL; 38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *name, *prefix = NULL, *nsName = NULL; 38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy; 38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldInsert; 38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->insert == NULL) 38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A comp->has_name == 0 indicates that we need to skip this instruction, 38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * since it was evaluated to be invalid already during compilation. 38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!comp->has_name) 38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stack and saves 38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldInsert = ctxt->insert; 39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->name == NULL) { 39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: fix attr acquisition wrt to the XSLT namespace */ 39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop = xsltEvalAttrValueTemplate(ctxt, inst, 39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "name", XSLT_NAMESPACE); 39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop == NULL) { 39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:element: The attribute 'name' is missing.\n"); 39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlValidateQName(prop, 0)) { 39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:element: The effective name '%s' is not a " 39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "valid QName.\n", prop); 39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we fall through to catch any further errors, if possible */ 39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = xsltSplitQName(ctxt->dict, prop, &prefix); 39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(prop); 39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((prefix != NULL) && 39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrncasecmp(prefix, (xmlChar *)"xml", 3))) 39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Should we really disallow an "xml" prefix? 39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The "name" value was static. 39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefix = comp->nsPrefix; 39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = comp->name; 39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = xsltSplitQName(ctxt->dict, comp->name, &prefix); 39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create the new element 39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->output->dict == ctxt->dict) { 39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewDocNodeEatName(ctxt->output, NULL, (xmlChar *)name, NULL); 39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xmlNewDocNode(ctxt->output, NULL, (xmlChar *)name, NULL); 39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (copy == NULL) { 39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:element : creation of %s failed\n", name); 39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltAddChild(ctxt->insert, copy); 39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Namespace 39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * --------- 39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->has_ns) { 39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->ns != NULL) { 39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * No AVT; just plain text for the namespace name. 39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->ns[0] != 0) 39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nsName = comp->ns; 39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *tmpNsName; 39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Eval the AVT. 39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: check attr acquisition wrt to the XSLT namespace */ 39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmpNsName = xsltEvalAttrValueTemplate(ctxt, inst, 39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) "namespace", XSLT_NAMESPACE); 39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPEC XSLT 1.0: 39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "If the string is empty, then the expanded-name of the 39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * attribute has a null namespace URI." 39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmpNsName != NULL) && (tmpNsName[0] != 0)) 39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nsName = xmlDictLookup(ctxt->dict, BAD_CAST tmpNsName, -1); 39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(tmpNsName); 39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr ns; 39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPEC XSLT 1.0: 39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "If the namespace attribute is not present, then the QName is 39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * expanded into an expanded-name using the namespace declarations 39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in effect for the xsl:element element, including any default 39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * namespace declaration. 39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ns = xmlSearchNs(inst->doc, inst, prefix); 39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ns == NULL) { 39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Check this in the compilation layer in case it's a 39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * static value. 39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prefix != NULL) { 39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:element: The QName '%s:%s' has no " 39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "namespace binding in scope in the stylesheet; " 40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "this is an error, since the namespace was not " 40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "specified by the instruction itself.\n", prefix, name); 40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else 40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nsName = ns->href; 40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find/create a matching ns-decl in the result tree. 40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nsName != NULL) { 40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->ns = xsltGetSpecialNamespace(ctxt, inst, nsName, prefix, copy); 40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ((copy->parent != NULL) && 40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (copy->parent->type == XML_ELEMENT_NODE) && 40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (copy->parent->ns != NULL)) 40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Undeclare" the default namespace. 40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetSpecialNamespace(ctxt, inst, NULL, NULL, copy); 40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = copy; 40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->has_use) { 40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->use != NULL) { 40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyAttributeSet(ctxt, node, inst, comp->use); 40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *attrSets = NULL; 40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUG TODO: use-attribute-sets is not a value template. 40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use-attribute-sets = qnames 40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrSets = xsltEvalAttrValueTemplate(ctxt, inst, 40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *)"use-attribute-sets", NULL); 40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (attrSets != NULL) { 40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyAttributeSet(ctxt, node, inst, attrSets); 40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(attrSets); 40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Instantiate the sequence constructor. 40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inst->children != NULL) 40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, ctxt->node, inst->children, 40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = oldInsert; 40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltComment: 40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xslt comment node 40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @comp: precomputed information 40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the xslt comment node on the source node 40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltComment(xsltTransformContextPtr ctxt, xmlNodePtr node, 40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr comp ATTRIBUTE_UNUSED) { 40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value = NULL; 40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr commentNode; 40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int len; 40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xsltEvalTemplateString(ctxt, node, inst); 40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: use or generate the compiled form */ 40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = xmlStrlen(value); 40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len > 0) { 40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((value[len-1] == '-') || 40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrstr(value, BAD_CAST "--"))) { 40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:comment : '--' or ending '-' not allowed in comment\n"); 40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* fall through to try to catch further errors */ 40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value == NULL) { 40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COMMENT,xsltGenericDebug(xsltGenericDebugContext, 40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltComment: empty\n")); 40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COMMENT,xsltGenericDebug(xsltGenericDebugContext, 40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltComment: content %s\n", value)); 40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) commentNode = xmlNewComment(value); 40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) commentNode = xsltAddChild(ctxt->insert, commentNode); 40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != NULL) 40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltProcessingInstruction: 40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xslt processing-instruction node 41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: precomputed information 41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the xslt processing-instruction node on the source node 41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltProcessingInstruction(xsltTransformContextPtr ctxt, xmlNodePtr node, 41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) { 41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemPIPtr comp = (xsltStyleItemPIPtr) castedComp; 41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *name; 41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value = NULL; 41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr pi; 41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->insert == NULL) 41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->has_name == 0) 41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->name == NULL) { 41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = xsltEvalAttrValueTemplate(ctxt, inst, 41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *)"name", NULL); 41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == NULL) { 41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:processing-instruction : name is missing\n"); 41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = comp->name; 41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: check that it's both an an NCName and a PITarget. */ 41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xsltEvalTemplateString(ctxt, node, inst); 41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrstr(value, BAD_CAST "?>") != NULL) { 41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:processing-instruction: '?>' not allowed within PI content\n"); 41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value == NULL) { 41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PI,xsltGenericDebug(xsltGenericDebugContext, 41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessingInstruction: %s empty\n", name)); 41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_PI,xsltGenericDebug(xsltGenericDebugContext, 41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltProcessingInstruction: %s content %s\n", name, value)); 41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pi = xmlNewDocPI(ctxt->insert->doc, name, value); 41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pi = xsltAddChild(ctxt->insert, pi); 41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((name != NULL) && (name != comp->name)) 41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree((xmlChar *) name); 41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != NULL) 41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCopyOf: 41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the current node in the source tree 41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the element node of the XSLT copy-of instruction 41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: precomputed information of the XSLT copy-of instruction 41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the XSLT copy-of instruction. 41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCopyOf(xsltTransformContextPtr ctxt, xmlNodePtr node, 41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) { 41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemCopyOfPtr comp = (xsltStyleItemCopyOfPtr) castedComp; 41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathObjectPtr res = NULL; 41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetPtr list = NULL; 41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldXPContextDoc; 41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr *oldXPNamespaces; 41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldXPContextNode; 41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; 41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xpctxt; 41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL) || (inst == NULL)) 41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((comp == NULL) || (comp->select == NULL) || (comp->comp == NULL)) { 41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:copy-of : compilation failed\n"); 41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPEC XSLT 1.0: 41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "The xsl:copy-of element can be used to insert a result tree 42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fragment into the result tree, without first converting it to 42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a string as xsl:value-of does (see [7.6.1 Generating Text with 42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsl:value-of]). The required select attribute contains an 42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * expression. When the result of evaluating the expression is a 42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * result tree fragment, the complete fragment is copied into the 42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * result tree. When the result is a node-set, all the nodes in the 42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * set are copied in document order into the result tree; copying 42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * an element node copies the attribute nodes, namespace nodes and 42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * children of the element node as well as the element node itself; 42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a root node is copied by copying its children. When the result 42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is neither a node-set nor a result tree fragment, the result is 42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * converted to a string and then inserted into the result tree, 42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as with xsl:value-of. 42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_OF,xsltGenericDebug(xsltGenericDebugContext, 42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyOf: select %s\n", comp->select)); 42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Evaluate the "select" expression. 42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt = ctxt->xpathCtxt; 42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextDoc = xpctxt->doc; 42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextNode = xpctxt->node; 42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPProximityPosition = xpctxt->proximityPosition; 42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextSize = xpctxt->contextSize; 42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPNsNr = xpctxt->nsNr; 42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPNamespaces = xpctxt->namespaces; 42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = node; 42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp != NULL) { 42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->inScopeNs != NULL) { 42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->inScopeNs->list; 42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->inScopeNs->xpathNumber; 42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->nsList; 42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->nsNr; 42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathCompiledEval(comp->comp, xpctxt); 42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPContextDoc; 42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = oldXPContextNode; 42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = oldXPNsNr; 42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = oldXPNamespaces; 42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->type == XPATH_NODESET) { 42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Node-set 42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -------- 42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_OF,xsltGenericDebug(xsltGenericDebugContext, 42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyOf: result is a node set\n")); 42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = res->nodesetval; 42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list != NULL) { 42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The list is already sorted in document order by XPath. 42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append everything in this order under ctxt->insert. 42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < list->nodeNr;i++) { 42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list->nodeTab[i]; 42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type == XML_DOCUMENT_NODE) || 42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->type == XML_HTML_DOCUMENT_NODE)) 42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyTreeList(ctxt, inst, 42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->children, ctxt->insert, 0, 0); 42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (cur->type == XML_ATTRIBUTE_NODE) { 42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltShallowCopyAttr(ctxt, inst, 42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert, (xmlAttrPtr) cur); 42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyTreeInternal(ctxt, inst, 42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur, ctxt->insert, 0, 0); 42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (res->type == XPATH_XSLT_TREE) { 42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Result tree fragment 42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * -------------------- 42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * E.g. via <xsl:variable ...><foo/></xsl:variable> 43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that the root node of such trees is an xmlDocPtr in Libxslt. 43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_OF,xsltGenericDebug(xsltGenericDebugContext, 43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyOf: result is a result tree fragment\n")); 43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = res->nodesetval; 43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((list != NULL) && (list->nodeTab != NULL) && 43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (list->nodeTab[0] != NULL) && 43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (IS_XSLT_REAL_NODE(list->nodeTab[0]))) 43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyTreeList(ctxt, inst, 43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list->nodeTab[0]->children, ctxt->insert, 0, 0); 43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value = NULL; 43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Convert to a string. 43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xmlXPathCastToString(res); 43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value == NULL) { 43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltCopyOf(): " 43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "failed to cast an XPath object to string.\n"); 43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value[0] != 0) { 43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Append content as text node. 43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCopyTextString(ctxt, ctxt->insert, value, 0); 43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_COPY_OF,xsltGenericDebug(xsltGenericDebugContext, 43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCopyOf: result %s\n", res->stringval)); 43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) 43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(res); 43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltValueOf: 43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xslt value-of node 43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: precomputed information 43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the xslt value-of node on the source node 43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltValueOf(xsltTransformContextPtr ctxt, xmlNodePtr node, 43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemValueOfPtr comp = (xsltStyleItemValueOfPtr) castedComp; 43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathObjectPtr res = NULL; 43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr copy = NULL; 43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *value = NULL; 43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldXPContextDoc; 43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr *oldXPNamespaces; 43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldXPContextNode; 43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; 43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xpctxt; 43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL) || (inst == NULL)) 43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((comp == NULL) || (comp->select == NULL) || (comp->comp == NULL)) { 43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltValueOf(): " 43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The XSLT 'value-of' instruction was not compiled.\n"); 43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_VALUE_OF,xsltGenericDebug(xsltGenericDebugContext, 43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltValueOf: select %s\n", comp->select)); 43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt = ctxt->xpathCtxt; 43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextDoc = xpctxt->doc; 43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextNode = xpctxt->node; 43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPProximityPosition = xpctxt->proximityPosition; 43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextSize = xpctxt->contextSize; 43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPNsNr = xpctxt->nsNr; 43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPNamespaces = xpctxt->namespaces; 43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = node; 43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp != NULL) { 44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->inScopeNs != NULL) { 44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->inScopeNs->list; 44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->inScopeNs->xpathNumber; 44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->nsList; 44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->nsNr; 44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathCompiledEval(comp->comp, xpctxt); 44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPContextDoc; 44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = oldXPContextNode; 44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = oldXPNsNr; 44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = oldXPNamespaces; 44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cast the XPath object to string. 44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value = xmlXPathCastToString(res); 44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value == NULL) { 44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltValueOf(): " 44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "failed to cast an XPath object to string.\n"); 44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value[0] != 0) { 44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy = xsltCopyTextString(ctxt, 44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert, value, comp->noescape); 44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "XPath evaluation returned no result.\n"); 44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value) { 44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_VALUE_OF,xsltGenericDebug(xsltGenericDebugContext, 44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltValueOf: result '%s'\n", value)); 44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value != NULL) 44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(value); 44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) 44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(res); 44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltNumber: 44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the node in the source tree. 44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xslt number node 44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: precomputed information 44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the xslt number node on the source node 44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltNumber(xsltTransformContextPtr ctxt, xmlNodePtr node, 44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemNumberPtr comp = (xsltStyleItemNumberPtr) castedComp; 44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp == NULL) { 44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:number : compilation failed\n"); 44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL) || (inst == NULL) || (comp == NULL)) 44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) comp->numdata.doc = inst->doc; 44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) comp->numdata.node = inst; 44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltNumberFormat(ctxt, &comp->numdata, node); 44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyImports: 44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @contextNode: the current node in the source tree. 45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the element node of the XSLT 'apply-imports' instruction 45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @comp: the compiled instruction 45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the XSLT apply-imports element. 45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyImports(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, 45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, 45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp ATTRIBUTE_UNUSED) 45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr templ; 45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (inst == NULL)) 45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp == NULL) { 45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltApplyImports(): " 45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The XSLT 'apply-imports' instruction was not compiled.\n"); 45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that ctxt->currentTemplateRule and ctxt->templ is not the 45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * same; the former is the "Current Template Rule" as defined by the 45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XSLT spec, the latter is simply the template struct being 45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * currently processed. 45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->currentTemplateRule == NULL) { 45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPEC XSLT 2.0: 45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "[ERR XTDE0560] It is a non-recoverable dynamic error if 45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsl:apply-imports or xsl:next-match is evaluated when the 45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * current template rule is null." 45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "It is an error to call 'apply-imports' " 45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "when there's no current template rule.\n"); 45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Check if this is correct. 45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ = xsltGetTemplate(ctxt, contextNode, 45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule->style); 45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (templ != NULL) { 45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr oldCurTemplRule = ctxt->currentTemplateRule; 45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the current template rule. 45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = templ; 45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * URGENT TODO: Need xsl:with-param be handled somehow here? 45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyXSLTTemplate(ctxt, contextNode, templ->content, 45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) templ, NULL); 45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = oldCurTemplRule; 45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCallTemplate: 45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT transformation context 45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the "current node" in the source tree 45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the XSLT 'call-template' instruction 45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: the compiled information of the instruction 45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Processes the XSLT call-template instruction on the source node. 45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCallTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node, 45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemCallTemplatePtr comp = 45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltStyleItemCallTemplatePtr) castedComp; 45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr withParams = NULL; 45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->insert == NULL) 45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp == NULL) { 45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The XSLT 'call-template' instruction was not compiled.\n"); 45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The template must have been precomputed 45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->templ == NULL) { 45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) comp->templ = xsltFindTemplate(ctxt, comp->name, comp->ns); 45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->templ == NULL) { 45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->ns != NULL) { 45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The called template '{%s}%s' was not found.\n", 46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) comp->ns, comp->name); 46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The called template '%s' was not found.\n", 46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) comp->name); 46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((comp != NULL) && (comp->name != NULL)) 46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_CALL_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "call-template: name %s\n", comp->name)); 46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inst->children) { 46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr param; 46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = inst->children; 46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->debugStatus != XSLT_DEBUG_NONE) 46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(cur, node, comp->templ, ctxt); 46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state == XSLT_STATE_STOPPED) break; 46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: The "with-param"s could be part of the "call-template" 46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * structure. Avoid to "search" for params dynamically 46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the XML tree every time. 46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_ELEM(cur)) { 46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_NAME(cur, "with-param")) { 46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param = xsltParseStylesheetCallerParam(ctxt, cur); 46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (param != NULL) { 46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param->next = withParams; 46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) withParams = param; 46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericError(xsltGenericErrorContext, 46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:call-template: misplaced xsl:%s\n", cur->name); 46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericError(xsltGenericErrorContext, 46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:call-template: misplaced %s element\n", cur->name); 46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new frame using the params first 46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyXSLTTemplate(ctxt, node, comp->templ->content, comp->templ, 46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) withParams); 46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (withParams != NULL) 46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeStackElemList(withParams); 46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((comp != NULL) && (comp->name != NULL)) 46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_CALL_TEMPLATE,xsltGenericDebug(xsltGenericDebugContext, 46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "call-template returned: name %s\n", comp->name)); 46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyTemplates: 46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT transformation context 46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the 'current node' in the source tree 46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the element node of an XSLT 'apply-templates' instruction 46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: the compiled instruction 46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Processes the XSLT 'apply-templates' instruction on the current node. 46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node, 46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemApplyTemplatesPtr comp = 46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltStyleItemApplyTemplatesPtr) castedComp; 46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, delNode = NULL, oldContextNode; 46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetPtr list = NULL, oldList; 46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr withParams = NULL; 46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPProximityPosition, oldXPContextSize, oldXPNsNr; 46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *oldMode, *oldModeURI; 46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldXPDoc; 46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDocumentPtr oldDocInfo; 46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xpctxt; 46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr *oldXPNamespaces; 46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp == NULL) { 46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:apply-templates : compilation failed\n"); 46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL) || (inst == NULL) || (comp == NULL)) 47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((node != NULL) && (node->name != NULL)) 47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, 47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyTemplates: node: '%s'\n", node->name)); 47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt = ctxt->xpathCtxt; 47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Save context states. 47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldContextNode = ctxt->node; 47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldMode = ctxt->mode; 47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldModeURI = ctxt->modeURI; 47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldDocInfo = ctxt->document; 47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldList = ctxt->nodeList; 47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The xpath context size and proximity position, as 47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * well as the xpath and context documents, may be changed 47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * so we save their initial state and will restore on exit 47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextSize = xpctxt->contextSize; 47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPProximityPosition = xpctxt->proximityPosition; 47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPDoc = xpctxt->doc; 47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPNsNr = xpctxt->nsNr; 47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPNamespaces = xpctxt->namespaces; 47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set up contexts. 47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->mode = comp->mode; 47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->modeURI = comp->modeURI; 47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->select != NULL) { 47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathObjectPtr res = NULL; 47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->comp == NULL) { 47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:apply-templates : compilation failed\n"); 47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, 47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyTemplates: select %s\n", comp->select)); 47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set up XPath. 47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = node; /* Set the "context node" */ 47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->inScopeNs != NULL) { 47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->inScopeNs->list; 47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->inScopeNs->xpathNumber; 47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->nsList; 47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->nsNr; 47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathCompiledEval(comp->comp, xpctxt); 47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->type == XPATH_NODESET) { 47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = res->nodesetval; /* consume the node set */ 47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->nodesetval = NULL; 47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The 'select' expression did not evaluate to a " 47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "node set.\n"); 47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(res); 47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(res); 47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note: An xsl:apply-templates with a 'select' attribute, 47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * can change the current source doc. 47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to evaluate the 'select' expression.\n"); 47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) { 47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, 47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyTemplates: select didn't evaluate to a node list\n")); 47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: Previously a document info (xsltDocument) was 48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * created and attached to the Result Tree Fragment. 48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * But such a document info is created on demand in 48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltKeyFunction() (functions.c), so we need to create 48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * it here beforehand. 48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In order to take care of potential keys we need to 48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * do some extra work for the case when a Result Tree Fragment 48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is converted into a nodeset (e.g. exslt:node-set()) : 48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We attach a "pseudo-doc" (xsltDocument) to _private. 48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This xsltDocument, together with the keyset, will be freed 48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * when the Result Tree Fragment is freed. 48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt->nbKeys > 0) && 48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (list->nodeNr != 0) && 48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (list->nodeTab[0]->doc != NULL) && 48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_IS_RES_TREE_FRAG(list->nodeTab[0]->doc)) 48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE that it's also OK if @effectiveDocInfo will be 48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * set to NULL. 48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) isRTF = 1; 48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) effectiveDocInfo = list->nodeTab[0]->doc->_private; 48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Build an XPath node set with the children 48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = xmlXPathNodeSetCreate(NULL); 48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list == NULL) 48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = node->children; 48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (cur->type) { 48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_TEXT_NODE: 48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((IS_BLANK_NODE(cur)) && 48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent != NULL) && 48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (cur->parent->type == XML_ELEMENT_NODE) && 48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ctxt->style->stripSpaces != NULL)) { 48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *val; 48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->parent->ns != NULL) { 48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (const xmlChar *) 48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(ctxt->style->stripSpaces, 48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent->name, 48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent->ns->href); 48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val == NULL) { 48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (const xmlChar *) 48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(ctxt->style->stripSpaces, 48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BAD_CAST "*", 48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent->ns->href); 48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (const xmlChar *) 48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(ctxt->style->stripSpaces, 48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->parent->name, NULL); 48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((val != NULL) && 48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(val, (xmlChar *) "strip"))) { 48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delNode = cur; 48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* no break on purpose */ 48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_ELEMENT_NODE: 48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DOCUMENT_NODE: 48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_HTML_DOCUMENT_NODE: 48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_CDATA_SECTION_NODE: 48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_PI_NODE: 48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_COMMENT_NODE: 48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathNodeSetAddUnique(list, cur); 48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XML_DTD_NODE: 48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Unlink the DTD, it's still reachable 48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * using doc->intSubset */ 48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) 48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->next->prev = cur->prev; 48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->prev != NULL) 48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->prev->next = cur->next; 48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, 48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyTemplates: skipping cur type %d\n", 48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->type)); 48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delNode = cur; 48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delNode != NULL) { 48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, 48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyTemplates: removing ignorable blank cur\n")); 48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(delNode); 48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(delNode); 49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delNode = NULL; 49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list != NULL) 49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, 49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyTemplates: list of %d nodes\n", list->nodeNr)); 49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((list == NULL) || (list->nodeNr == 0)) 49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the context's node set and size; this is also needed for 49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for xsltDoSortFunction(). 49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nodeList = list; 49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process xsl:with-param and xsl:sort instructions. 49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (The code became so verbose just to avoid the 49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xmlNodePtr sorts[XSLT_MAX_SORT] if there's no xsl:sort) 49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUG TODO: We are not using namespaced potentially defined on the 49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsl:sort or xsl:with-param elements; XPath expression might fail. 49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (inst->children) { 49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr param; 49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = inst->children; 49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur) { 49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->debugStatus != XSLT_DEBUG_NONE) 49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(cur, node, NULL, ctxt); 49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state == XSLT_STATE_STOPPED) 49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_TEXT_NODE) { 49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! IS_XSLT_ELEM(cur)) 49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_NAME(cur, "with-param")) { 49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param = xsltParseStylesheetCallerParam(ctxt, cur); 49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (param != NULL) { 49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param->next = withParams; 49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) withParams = param; 49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_NAME(cur, "sort")) { 49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr oldCurTempRule = 49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule; 49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbsorts = 0; 49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr sorts[XSLT_MAX_SORT]; 49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorts[nbsorts++] = cur; 49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur) { 49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->debugStatus != XSLT_DEBUG_NONE) 49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(cur, node, NULL, ctxt); 49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->state == XSLT_STATE_STOPPED) 49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->type == XML_TEXT_NODE) { 49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue; 49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (! IS_XSLT_ELEM(cur)) 49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_NAME(cur, "with-param")) { 49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param = xsltParseStylesheetCallerParam(ctxt, cur); 49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (param != NULL) { 49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param->next = withParams; 49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) withParams = param; 49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_NAME(cur, "sort")) { 49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbsorts >= XSLT_MAX_SORT) { 49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The number (%d) of xsl:sort instructions exceeds the " 49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "maximum allowed by this processor's settings.\n", 49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nbsorts); 49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorts[nbsorts++] = cur; 49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The "current template rule" is cleared for xsl:sort. 49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = NULL; 50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Sort. 50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDoSortFunction(ctxt, sorts, nbsorts); 50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = oldCurTempRule; 50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = list->nodeNr; 50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply templates for all selected source nodes. 50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < list->nodeNr; i++) { 50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list->nodeTab[i]; 50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The node becomes the "current node". 50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = cur; 50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * An xsl:apply-templates can change the current context doc. 50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OPTIMIZE TODO: Get rid of the need to set the context doc. 50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_NAMESPACE_DECL) && (cur->doc != NULL)) 50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = cur->doc; 50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = i + 1; 50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find and apply a template for this node. 50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltProcessOneNode(ctxt, cur, withParams); 50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit: 50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free the parameter list. 50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (withParams != NULL) 50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeStackElemList(withParams); 50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (list != NULL) 50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeNodeSet(list); 50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Restore context states. 50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = oldXPNsNr; 50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = oldXPNamespaces; 50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPDoc; 50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = oldDocInfo; 50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nodeList = oldList; 50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = oldContextNode; 50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->mode = oldMode; 50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->modeURI = oldModeURI; 50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltChoose: 50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @contextNode: the current node in the source tree 50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xsl:choose instruction 50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @comp: compiled information of the instruction 50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Processes the xsl:choose instruction on the source node. 50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltChoose(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, 50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr comp ATTRIBUTE_UNUSED) 50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur; 50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL)) 50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Content model checks should be done only at compilation 50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * time. 50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = inst->children; 50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) { 50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:choose: The instruction has no content.\n"); 50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We don't check the content model during transformation. 50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((! IS_XSLT_ELEM(cur)) || (! IS_XSLT_NAME(cur, "when"))) { 50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:choose: xsl:when expected first\n"); 50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int testRes = 0, res = 0; 51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xpctxt = ctxt->xpathCtxt; 51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldXPContextDoc = xpctxt->doc; 51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPProximityPosition = xpctxt->proximityPosition; 51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPContextSize = xpctxt->contextSize; 51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr *oldXPNamespaces = xpctxt->namespaces; 51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPNsNr = xpctxt->nsNr; 51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemWhenPtr wcomp = NULL; 51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr wcomp = NULL; 51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process xsl:when --------------------------------------------------- 51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_XSLT_ELEM(cur) && IS_XSLT_NAME(cur, "when")) { 51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wcomp = cur->psvi; 51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((wcomp == NULL) || (wcomp->test == NULL) || 51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (wcomp->comp == NULL)) 51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, cur, 51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltChoose(): " 51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The XSLT 'when' instruction was not compiled.\n"); 51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xslDebugStatus != XSLT_DEBUG_NONE) { 51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: Isn't comp->templ always NULL for xsl:choose? 51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(cur, contextNode, NULL, ctxt); 51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_CHOOSE,xsltGenericDebug(xsltGenericDebugContext, 51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltChoose: test %s\n", wcomp->test)); 51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = contextNode; 51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPContextDoc; 51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (wcomp->inScopeNs != NULL) { 51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = wcomp->inScopeNs->list; 51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = wcomp->inScopeNs->xpathNumber; 51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = wcomp->nsList; 51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = wcomp->nsNr; 51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_FAST_IF 51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathCompiledEvalToBoolean(wcomp->comp, xpctxt); 51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == -1) { 51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testRes = (res == 1) ? 1 : 0; 51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* XSLT_FAST_IF */ 51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathCompiledEval(wcomp->comp, xpctxt); 51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->type != XPATH_BOOLEAN) 51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathConvertBoolean(res); 51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->type == XPATH_BOOLEAN) 51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testRes = res->boolval; 51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_CHOOSE,xsltGenericDebug(xsltGenericDebugContext, 51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltChoose: test didn't evaluate to a boolean\n")); 51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(res); 51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = NULL; 51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* else of XSLT_FAST_IF */ 51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_CHOOSE,xsltGenericDebug(xsltGenericDebugContext, 52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltChoose: test evaluate to %d\n", testRes)); 52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (testRes) 52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto test_is_true; 52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process xsl:otherwise ---------------------------------------------- 52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_ELEM(cur) && IS_XSLT_NAME(cur, "otherwise")) { 52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xslDebugStatus != XSLT_DEBUG_NONE) 52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(cur, contextNode, NULL, ctxt); 52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_CHOOSE,xsltGenericDebug(xsltGenericDebugContext, 52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "evaluating xsl:otherwise\n")); 52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto test_is_true; 52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = contextNode; 52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPContextDoc; 52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = oldXPNamespaces; 52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = oldXPNsNr; 52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)test_is_true: 52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = contextNode; 52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPContextDoc; 52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = oldXPNamespaces; 52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = oldXPNsNr; 52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto process_sequence; 52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)process_sequence: 52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Instantiate the sequence constructor. 52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, ctxt->node, cur->children, 52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit: 52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltIf: 52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @contextNode: the current node in the source tree 52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the xsl:if instruction 52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: compiled information of the instruction 52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Processes the xsl:if instruction on the source node. 52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltIf(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, 52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int res = 0; 52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemIfPtr comp = (xsltStyleItemIfPtr) castedComp; 52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL)) 52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((comp == NULL) || (comp->test == NULL) || (comp->comp == NULL)) { 52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltIf(): " 52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The XSLT 'if' instruction was not compiled.\n"); 52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_IF,xsltGenericDebug(xsltGenericDebugContext, 52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltIf: test %s\n", comp->test)); 52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_FAST_IF 52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xpctxt = ctxt->xpathCtxt; 52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldXPContextDoc = xpctxt->doc; 52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr *oldXPNamespaces = xpctxt->namespaces; 52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldXPContextNode = xpctxt->node; 52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPProximityPosition = xpctxt->proximityPosition; 52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPContextSize = xpctxt->contextSize; 52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPNsNr = xpctxt->nsNr; 53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldLocalFragmentTop = ctxt->localRVT; 53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = contextNode; 53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp != NULL) { 53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->inScopeNs != NULL) { 53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->inScopeNs->list; 53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->inScopeNs->xpathNumber; 53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->nsList; 53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->nsNr; 53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This XPath function is optimized for boolean results. 53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathCompiledEvalToBoolean(comp->comp, xpctxt); 53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup fragments created during evaluation of the 53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "select" expression. 53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (oldLocalFragmentTop != ctxt->localRVT) 53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop); 53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPContextDoc; 53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = oldXPContextNode; 53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = oldXPNsNr; 53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = oldXPNamespaces; 53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_IF,xsltGenericDebug(xsltGenericDebugContext, 53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltIf: test evaluate to %d\n", res)); 53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == -1) { 53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == 1) { 53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Instantiate the sequence constructor of xsl:if. 53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, 53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contextNode, inst->children, NULL); 53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else /* XSLT_FAST_IF */ 53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathObjectPtr xpobj = NULL; 53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OLD CODE: 53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xpctxt = ctxt->xpathCtxt; 53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldXPContextDoc = xpctxt->doc; 53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNsPtr *oldXPNamespaces = xpctxt->namespaces; 53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldXPContextNode = xpctxt->node; 53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPProximityPosition = xpctxt->proximityPosition; 53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPContextSize = xpctxt->contextSize; 53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPNsNr = xpctxt->nsNr; 53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = contextNode; 53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp != NULL) { 53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->inScopeNs != NULL) { 53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->inScopeNs->list; 53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->inScopeNs->xpathNumber; 53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->nsList; 53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->nsNr; 53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This XPath function is optimized for boolean results. 53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpobj = xmlXPathCompiledEval(comp->comp, xpctxt); 53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPContextDoc; 53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = oldXPContextNode; 54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = oldXPNsNr; 54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = oldXPNamespaces; 54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xpobj != NULL) { 54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xpobj->type != XPATH_BOOLEAN) 54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpobj = xmlXPathConvertBoolean(xpobj); 54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xpobj->type == XPATH_BOOLEAN) { 54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xpobj->boolval; 54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_IF,xsltGenericDebug(xsltGenericDebugContext, 54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltIf: test evaluate to %d\n", res)); 54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res) { 54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, 54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contextNode, inst->children, NULL); 54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt, XSLT_TRACE_IF, 54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltIf: test didn't evaluate to a boolean\n")); 54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(xpobj); 54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* else of XSLT_FAST_IF */ 54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltForEach: 54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @contextNode: the "current node" in the source tree 54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @inst: the element node of the xsl:for-each instruction 54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @castedComp: the compiled information of the instruction 54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Process the xslt for-each node on the source node 54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltForEach(xsltTransformContextPtr ctxt, xmlNodePtr contextNode, 54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr inst, xsltStylePreCompPtr castedComp) 54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStyleItemForEachPtr comp = (xsltStyleItemForEachPtr) castedComp; 54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylePreCompPtr comp = castedComp; 54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathObjectPtr res = NULL; 54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur, curInst; 54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetPtr list = NULL; 54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodeSetPtr oldList; 54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldXPProximityPosition, oldXPContextSize; 54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr oldContextNode; 54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr oldCurTemplRule; 54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldXPDoc; 54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDocumentPtr oldDocInfo; 54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathContextPtr xpctxt; 54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (contextNode == NULL) || (inst == NULL)) { 54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericError(xsltGenericErrorContext, 54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltForEach(): Bad arguments.\n"); 54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp == NULL) { 54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltForEach(): " 54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The XSLT 'for-each' instruction was not compiled.\n"); 54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((comp->select == NULL) || (comp->comp == NULL)) { 54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error in xsltForEach(): " 54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The selecting expression of the XSLT 'for-each' " 54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "instruction was not compiled correctly.\n"); 54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt = ctxt->xpathCtxt; 54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_FOR_EACH,xsltGenericDebug(xsltGenericDebugContext, 54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltForEach: select %s\n", comp->select)); 54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Save context states. 54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldDocInfo = ctxt->document; 54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldList = ctxt->nodeList; 55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldContextNode = ctxt->node; 55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The "current template rule" is cleared for the instantiation of 55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsl:for-each. 55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldCurTemplRule = ctxt->currentTemplateRule; 55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = NULL; 55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPDoc = xpctxt->doc; 55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPProximityPosition = xpctxt->proximityPosition; 55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldXPContextSize = xpctxt->contextSize; 55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set up XPath. 55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = contextNode; 55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (comp->inScopeNs != NULL) { 55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->inScopeNs->list; 55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->inScopeNs->xpathNumber; 55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = NULL; 55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = 0; 55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->namespaces = comp->nsList; 55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->nsNr = comp->nsNr; 55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Evaluate the 'select' expression. 55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlXPathCompiledEval(comp->comp, ctxt->xpathCtxt); 55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->type == XPATH_NODESET) 55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list = res->nodesetval; 55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The 'select' expression does not evaluate to a node set.\n"); 55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_FOR_EACH,xsltGenericDebug(xsltGenericDebugContext, 55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltForEach: select didn't evaluate to a node list\n")); 55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, inst, 55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Failed to evaluate the 'select' expression.\n"); 55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->state = XSLT_STATE_STOPPED; 55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((list == NULL) || (list->nodeNr <= 0)) 55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto exit; 55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_FOR_EACH,xsltGenericDebug(xsltGenericDebugContext, 55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltForEach: select evaluates to %d nodes\n", list->nodeNr)); 55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Restore XPath states for the "current node". 55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->node = contextNode; 55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the list; this has to be done already here for xsltDoSortFunction(). 55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nodeList = list; 55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Handle xsl:sort instructions and skip them for further processing. 55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUG TODO: We are not using namespaced potentially defined on the 55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsl:sort element; XPath expression might fail. 55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curInst = inst->children; 55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_ELEM(curInst) && IS_XSLT_NAME(curInst, "sort")) { 55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nbsorts = 0; 55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr sorts[XSLT_MAX_SORT]; 55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorts[nbsorts++] = curInst; 55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xslDebugStatus != XSLT_DEBUG_NONE) 55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(curInst, contextNode, NULL, ctxt); 55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curInst = curInst->next; 55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (IS_XSLT_ELEM(curInst) && IS_XSLT_NAME(curInst, "sort")) { 55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (nbsorts >= XSLT_MAX_SORT) { 55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, curInst, 55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The number of xsl:sort instructions exceeds the " 55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "maximum (%d) allowed by this processor.\n", 55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_MAX_SORT); 55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorts[nbsorts++] = curInst; 55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_DEBUGGER 56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xslDebugStatus != XSLT_DEBUG_NONE) 56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xslHandleDebugger(curInst, contextNode, NULL, ctxt); 56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curInst = curInst->next; 56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDoSortFunction(ctxt, sorts, nbsorts); 56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = list->nodeNr; 56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Instantiate the sequence constructor for each selected node. 56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < list->nodeNr; i++) { 56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = list->nodeTab[i]; 56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The selected node becomes the "current node". 56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = cur; 56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * An xsl:for-each can change the current context doc. 56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OPTIMIZE TODO: Get rid of the need to set the context doc. 56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur->type != XML_NAMESPACE_DECL) && (cur->doc != NULL)) 56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = cur->doc; 56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = i + 1; 56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplySequenceConstructor(ctxt, cur, curInst, NULL); 56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exit: 56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) 56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(res); 56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Restore old states. 56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->document = oldDocInfo; 56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nodeList = oldList; 56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = oldContextNode; 56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->currentTemplateRule = oldCurTemplRule; 56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->doc = oldXPDoc; 56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->contextSize = oldXPContextSize; 56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xpctxt->proximityPosition = oldXPProximityPosition; 56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Generic interface * 56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_GENERATE_HTML_DOCTYPE 56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct xsltHTMLVersion { 56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *version; 56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *public; 56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *system; 56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} xsltHTMLVersion; 56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xsltHTMLVersion xsltHTMLVersions[] = { 56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.01frame", "-//W3C//DTD HTML 4.01 Frameset//EN", 56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd"}, 56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.01strict", "-//W3C//DTD HTML 4.01//EN", 56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd"}, 56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.01trans", "-//W3C//DTD HTML 4.01 Transitional//EN", 56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"}, 56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.01", "-//W3C//DTD HTML 4.01 Transitional//EN", 56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd"}, 56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.0strict", "-//W3C//DTD HTML 4.01//EN", 56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/html4/strict.dtd"}, 56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.0trans", "-//W3C//DTD HTML 4.01 Transitional//EN", 56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/html4/loose.dtd"}, 56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.0frame", "-//W3C//DTD HTML 4.01 Frameset//EN", 56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/html4/frameset.dtd"}, 56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "4.0", "-//W3C//DTD HTML 4.01 Transitional//EN", 56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "http://www.w3.org/TR/html4/loose.dtd"}, 56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "3.2", "-//W3C//DTD HTML 3.2//EN", NULL } 56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltGetHTMLIDs: 56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @version: the version string 56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @publicID: used to return the public ID 56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @systemID: used to return the system ID 56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 if not found, 0 otherwise and the system and public 56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Identifier for this given verion of HTML 56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltGetHTMLIDs(const xmlChar *version, const xmlChar **publicID, 56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar **systemID) { 56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (version == NULL) 56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0;i < (sizeof(xsltHTMLVersions)/sizeof(xsltHTMLVersions[1])); 56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i++) { 56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!xmlStrcasecmp(version, 56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (const xmlChar *) xsltHTMLVersions[i].version)) { 57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (publicID != NULL) 57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *publicID = (const xmlChar *) xsltHTMLVersions[i].public; 57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (systemID != NULL) 57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *systemID = (const xmlChar *) xsltHTMLVersions[i].system; 57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyStripSpaces: 57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: a XSLT process context 57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: the root of the XML tree 57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Strip the unwanted ignorable spaces from the input tree 57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyStripSpaces(xsltTransformContextPtr ctxt, xmlNodePtr node) { 57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr current; 57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int nb = 0; 57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current = node; 57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (current != NULL) { 57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cleanup children empty nodes if asked for 57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((IS_XSLT_REAL_NODE(current)) && 57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (current->children != NULL) && 57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltFindElemSpaceHandling(ctxt, current))) { 57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr delete = NULL, cur = current->children; 57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_BLANK_NODE(cur)) 57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = cur; 57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete != NULL) { 57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode(delete); 57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeNode(delete); 57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete = NULL; 57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nb++; 57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Skip to next node in document order. 57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->type == XML_ENTITY_REF_NODE) { 57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* process deep in entities */ 57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyStripSpaces(ctxt, node->children); 57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((current->children != NULL) && 57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (current->type != XML_ENTITY_REF_NODE)) { 57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current = current->children; 57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (current->next != NULL) { 57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current = current->next; 57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current = current->parent; 57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current == NULL) 57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current == node) 57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto done; 57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current->next != NULL) { 57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current = current->next; 57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (current != NULL); 57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done: 57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG_PROCESS 57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TRACE(ctxt,XSLT_TRACE_STRIP_SPACES,xsltGenericDebug(xsltGenericDebugContext, 57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyStripSpaces: removed %d ignorable blank node\n", nb)); 57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCountKeys(xsltTransformContextPtr ctxt) 57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr style; 57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltKeyDefPtr keyd; 57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do we have those nastly templates with a key() in the match pattern? 57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->hasTemplKeyPatterns = 0; 58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = ctxt->style; 58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (style != NULL) { 58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->keyMatch != NULL) { 58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->hasTemplKeyPatterns = 1; 58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = xsltNextImport(style); 58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Count number of key declarations. 58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbKeys = 0; 58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = ctxt->style; 58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (style != NULL) { 58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyd = style->keys; 58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (keyd) { 58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->nbKeys++; 58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) keyd = keyd->next; 58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = xsltNextImport(style); 58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ctxt->nbKeys); 58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyStylesheetInternal: 58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: a parsed XSLT stylesheet 58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a parsed XML document 58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: a NULL terminated array of parameters names/values tuples 58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the targetted output 58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @profile: profile FILE * output or NULL 58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @user: user provided parameter 58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the stylesheet to the document 58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: This may lead to a non-wellformed output XML wise ! 58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the result document or NULL in case of error 58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xmlDocPtr 58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyStylesheetInternal(xsltStylesheetPtr style, xmlDocPtr doc, 58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **params, const char *output, 58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE * profile, xsltTransformContextPtr userCtxt) 58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr res = NULL; 58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr ctxt = NULL; 58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr root, node; 58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *method; 58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *doctypePublic; 58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *doctypeSystem; 58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *version; 58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *encoding; 58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr variables; 58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStackElemPtr vptr; 58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltInitGlobals(); 58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((style == NULL) || (doc == NULL)) 58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->internalized == 0) { 58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Stylesheet was not fully internalized !\n"); 58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->intSubset != NULL) { 58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Avoid hitting the DTD when scanning nodes 58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * but keep it linked as doc->intSubset 58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr cur = (xmlNodePtr) doc->intSubset; 58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) 58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->next->prev = cur->prev; 58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->prev != NULL) 58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->prev->next = cur->next; 58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->children == cur) 58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc->children = cur->next; 58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doc->last == cur) 58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doc->last = cur->prev; 58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur->prev = cur->next = NULL; 58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check for XPath document order availability 58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(doc); 58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root != NULL) { 58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((long) root->content) >= 0 && (xslDebugStatus == XSLT_DEBUG_NONE)) 58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathOrderDocElems(doc); 58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (userCtxt != NULL) 58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = userCtxt; 58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 58945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt = xsltNewTransformContext(style, doc); 58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->initialContextDoc = doc; 59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->initialContextNode = (xmlNodePtr) doc; 59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile != NULL) 59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->profile = 1; 59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output != NULL) 59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->outputFile = output; 59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->outputFile = NULL; 59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * internalize the modes if needed 59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->dict != NULL) { 59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->mode != NULL) 59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->mode = xmlDictLookup(ctxt->dict, ctxt->mode, -1); 59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->modeURI != NULL) 59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->modeURI = xmlDictLookup(ctxt->dict, ctxt->modeURI, -1); 59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(method, style, method) 59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypePublic, style, doctypePublic) 59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypeSystem, style, doctypeSystem) 59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(version, style, version) 59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(encoding, style, encoding) 59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((method != NULL) && 59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrEqual(method, (const xmlChar *) "xml"))) 59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(method, (const xmlChar *) "html")) { 59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_HTML; 59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) { 59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = htmlNewDoc(doctypeSystem, doctypePublic); 59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (version == NULL) { 59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDtdPtr dtd; 59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = htmlNewDoc(NULL, NULL); 59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Make sure no DTD node is generated in this case 59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 59415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dtd = xmlGetIntSubset(res); 59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dtd != NULL) { 59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlUnlinkNode((xmlNodePtr) dtd); 59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDtd(dtd); 59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->intSubset = NULL; 59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->extSubset = NULL; 59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_GENERATE_HTML_DOCTYPE 59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetHTMLIDs(version, &doctypePublic, &doctypeSystem); 59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = htmlNewDoc(doctypeSystem, doctypePublic); 59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(res->dict); 59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "reusing transformation dict for output\n"); 59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(method, (const xmlChar *) "xhtml")) { 59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, (xmlNodePtr) doc, 59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyStylesheetInternal: unsupported method xhtml, using html\n", 59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->method); 59715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_HTML; 59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = htmlNewDoc(doctypeSystem, doctypePublic); 59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(res->dict); 59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "reusing transformation dict for output\n"); 59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (xmlStrEqual(method, (const xmlChar *) "text")) { 59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_TEXT; 59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlNewDoc(style->version); 59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(res->dict); 59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "reusing transformation dict for output\n"); 59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 59945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, (xmlNodePtr) doc, 59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyStylesheetInternal: unsupported method %s\n", 59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->method); 59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_XML; 60025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xmlNewDoc(style->version); 60035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == NULL) 60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->dict = ctxt->dict; 60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDictReference(ctxt->dict); 60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef WITH_XSLT_DEBUG 60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGenericDebug(xsltGenericDebugContext, 60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "reusing transformation dict for output\n"); 60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 60115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->charset = XML_CHAR_ENCODING_UTF8; 60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (encoding != NULL) 60145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->encoding = xmlStrdup(encoding); 60155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variables = style->variables; 60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Start the evaluation, evaluate the params, the stylesheets globals 60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and start by processing the top node. 60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xsltNeedElemSpaceHandling(ctxt)) 60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltApplyStripSpaces(ctxt, xmlDocGetRootElement(doc)); 60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Evaluate global params and user-provided params. 60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = (xmlNodePtr) doc; 60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->globalVars == NULL) 60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->globalVars = xmlHashCreate(20); 60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (params != NULL) { 60305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltEvalUserParams(ctxt, params); 60315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* need to be called before evaluating global variables */ 60345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCountKeys(ctxt); 60355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltEvalGlobalVariables(ctxt); 60375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->node = (xmlNodePtr) doc; 60395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->output = res; 60405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->insert = (xmlNodePtr) res; 60415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->varsBase = ctxt->varsNr - 1; 60425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->contextSize = 1; 60445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->proximityPosition = 1; 60455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->xpathCtxt->node = NULL; /* TODO: Set the context node here? */ 60465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Start processing the source tree ----------------------------------- 60485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltProcessOneNode(ctxt, ctxt->node, NULL); 60505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove all remaining vars from the stack. 60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltLocalVariablePop(ctxt, 0, -2); 60545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltShutdownCtxtExts(ctxt); 60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltCleanupTemplates(style); /* TODO: <- style should be read only */ 60575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Now cleanup our variables so stylesheet can be re-used 60605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 60615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: this is not needed anymore global variables are copied 60625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and not evaluated directly anymore, keep this as a check 60635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->variables != variables) { 60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vptr = style->variables; 60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (vptr->next != variables) 60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vptr = vptr->next; 60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vptr->next = NULL; 60695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeStackElemList(style->variables); 60705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->variables = variables; 60715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vptr = style->variables; 60735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (vptr != NULL) { 60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vptr->computed) { 60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vptr->value != NULL) { 60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeObject(vptr->value); 60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vptr->value = NULL; 60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vptr->computed = 0; 60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vptr = vptr->next; 60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0 60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * code disabled by wmb; awaiting kb's review 60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * problem is that global variable(s) may contain xpath objects 60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from doc associated with RVT, so can't be freed at this point. 60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltFreeTransformContext includes a call to xsltFreeRVTs, so 60895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * I assume this shouldn't be required at this point. 60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free all remaining tree fragments. 60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeRVTs(ctxt); 60955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 60965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 60975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do some post processing work depending on the generated output 60985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root = xmlDocGetRootElement(res); 61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (root != NULL) { 61015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *doctype = NULL; 61025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((root->ns != NULL) && (root->ns->prefix != NULL)) 61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctype = xmlDictQLookup(ctxt->dict, root->ns->prefix, root->name); 61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (doctype == NULL) 61065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctype = root->name; 61075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 61095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the default selection of the method 61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 61115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((method == NULL) && 61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (root->ns == NULL) && 61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (!xmlStrcasecmp(root->name, (const xmlChar *) "html"))) { 61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr tmp; 61155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = res->children; 61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while ((tmp != NULL) && (tmp != root)) { 61185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp->type == XML_ELEMENT_NODE) 61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 61205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((tmp->type == XML_TEXT_NODE) && (!xmlIsBlankNode(tmp))) 61215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 61225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = tmp->next; 61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == root) { 61255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->type = XSLT_OUTPUT_HTML; 61265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 61275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT TODO: XML_HTML_DOCUMENT_NODE is set after the 61285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transformation on the doc, but functions like 61295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->type = XML_HTML_DOCUMENT_NODE; 61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) { 61325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->intSubset = xmlCreateIntSubset(res, doctype, 61335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypePublic, 61345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypeSystem); 61355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_GENERATE_HTML_DOCTYPE 61365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (version != NULL) { 61375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltGetHTMLIDs(version, &doctypePublic, 61385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &doctypeSystem); 61395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) 61405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->intSubset = 61415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlCreateIntSubset(res, doctype, 61425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypePublic, 61435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypeSystem); 61445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 61455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt->type == XSLT_OUTPUT_XML) { 61505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypePublic, style, doctypePublic) 61515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_GET_IMPORT_PTR(doctypeSystem, style, doctypeSystem) 61525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((doctypePublic != NULL) || (doctypeSystem != NULL))) { 61535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlNodePtr last; 61545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Need a small "hack" here to assure DTD comes before 61555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) possible comment nodes */ 61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node = res->children; 61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last = res->last; 61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->children = NULL; 61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->last = NULL; 61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->intSubset = xmlCreateIntSubset(res, doctype, 61615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypePublic, 61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doctypeSystem); 61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->children != NULL) { 61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->children->next = node; 61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->prev = res->children; 61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->last = last; 61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->children = node; 61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->last = last; 61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlXPathFreeNodeSet(ctxt->nodeList); 61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (profile != NULL) { 61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSaveProfiling(ctxt, profile); 61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Be pedantic. 61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (ctxt->state == XSLT_STATE_ERROR)) { 61835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(res); 61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = NULL; 61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((res != NULL) && (ctxt != NULL) && (output != NULL)) { 61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltCheckWrite(ctxt->sec, ctxt, (const xmlChar *) output); 61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyStylesheet: forbidden to save to %s\n", 61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output); 61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ret < 0) { 61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltApplyStylesheet: saving to %s may not be possible\n", 61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output); 61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_DEBUG_PROFILE_CACHE 62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("# Cache:\n"); 62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("# Reused tree fragments: %d\n", ctxt->cache->dbgReusedRVTs); 62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("# Reused variables : %d\n", ctxt->cache->dbgReusedVars); 62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (userCtxt == NULL)) 62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeTransformContext(ctxt); 62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (res); 62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) 62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(res); 62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_DEBUG_PROFILE_CACHE 62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("# Cache:\n"); 62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("# Reused tree fragments: %d\n", ctxt->cache->dbgReusedRVTs); 62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("# Reused variables : %d\n", ctxt->cache->dbgReusedVars); 62205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt != NULL) && (userCtxt == NULL)) 62235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFreeTransformContext(ctxt); 62245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (NULL); 62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 62285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyStylesheet: 62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: a parsed XSLT stylesheet 62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a parsed XML document 62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: a NULL terminated arry of parameters names/values tuples 62325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the stylesheet to the document 62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: This may lead to a non-wellformed output XML wise ! 62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the result document or NULL in case of error 62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocPtr 62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyStylesheet(xsltStylesheetPtr style, xmlDocPtr doc, 62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **params) 62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (xsltApplyStylesheetInternal(style, doc, params, NULL, NULL, NULL)); 62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltProfileStylesheet: 62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: a parsed XSLT stylesheet 62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a parsed XML document 62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: a NULL terminated arry of parameters names/values tuples 62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: a FILE * for the profiling output 62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the stylesheet to the document and dump the profiling to 62535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the given output. 62545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the result document or NULL in case of error 62565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 62575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocPtr 62585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltProfileStylesheet(xsltStylesheetPtr style, xmlDocPtr doc, 62595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **params, FILE * output) 62605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 62615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr res; 62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xsltApplyStylesheetInternal(style, doc, params, NULL, output, NULL); 62645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (res); 62655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 62685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltApplyStylesheetUser: 62695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: a parsed XSLT stylesheet 62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a parsed XML document 62715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: a NULL terminated array of parameters names/values tuples 62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the targetted output 62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @profile: profile FILE * output or NULL 62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @userCtxt: user provided transform context 62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the stylesheet to the document and allow the user to provide 62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * its own transformation context. 62785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 62795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the result document or NULL in case of error 62805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmlDocPtr 62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltApplyStylesheetUser(xsltStylesheetPtr style, xmlDocPtr doc, 62835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **params, const char *output, 62845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE * profile, xsltTransformContextPtr userCtxt) 62855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 62865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr res; 62875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xsltApplyStylesheetInternal(style, doc, params, output, 62895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile, userCtxt); 62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (res); 62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltRunStylesheetUser: 62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: a parsed XSLT stylesheet 62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a parsed XML document 62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: a NULL terminated array of parameters names/values tuples 62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the URL/filename ot the generated resource if available 62995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SAX: a SAX handler for progressive callback output (not implemented yet) 63005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @IObuf: an output buffer for progressive output (not implemented yet) 63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @profile: profile FILE * output or NULL 63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @userCtxt: user provided transform context 63035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 63045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the stylesheet to the document and generate the output according 63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to @output @SAX and @IObuf. It's an error to specify both @SAX and @IObuf. 63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: This may lead to a non-wellformed output XML wise ! 63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: This may also result in multiple files being generated 63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: using IObuf, the result encoding used will be the one used for 63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * creating the output buffer, use the following macro to read it 63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from the stylesheet 63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XSLT_GET_IMPORT_PTR(encoding, style, encoding) 63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: using SAX, any encoding specified in the stylesheet will be lost 63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * since the interface uses only UTF8 63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of by written to the main resource or -1 in case of 63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error. 63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 63195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 63205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltRunStylesheetUser(xsltStylesheetPtr style, xmlDocPtr doc, 63215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **params, const char *output, 63225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSAXHandlerPtr SAX, xmlOutputBufferPtr IObuf, 63235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE * profile, xsltTransformContextPtr userCtxt) 63245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 63255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr tmp; 63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((output == NULL) && (SAX == NULL) && (IObuf == NULL)) 63295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((SAX != NULL) && (IObuf != NULL)) 63315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* unsupported yet */ 63345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (SAX != NULL) { 63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_TODO /* xsltRunStylesheet xmlSAXHandlerPtr SAX */ 63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tmp = xsltApplyStylesheetInternal(style, doc, params, output, profile, 63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) userCtxt); 63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (tmp == NULL) { 63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, NULL, (xmlNodePtr) doc, 63435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltRunStylesheet : run failed\n"); 63445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (-1); 63455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IObuf != NULL) { 63475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO: incomplete, IObuf output not progressive */ 63485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltSaveResultTo(IObuf, tmp, style); 63495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 63505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltSaveResultToFilename(output, tmp, style, 0); 63515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(tmp); 63535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 63545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 63575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltRunStylesheet: 63585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: a parsed XSLT stylesheet 63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @doc: a parsed XML document 63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @params: a NULL terminated array of parameters names/values tuples 63615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @output: the URL/filename ot the generated resource if available 63625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @SAX: a SAX handler for progressive callback output (not implemented yet) 63635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @IObuf: an output buffer for progressive output (not implemented yet) 63645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 63655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply the stylesheet to the document and generate the output according 63665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to @output @SAX and @IObuf. It's an error to specify both @SAX and @IObuf. 63675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: This may lead to a non-wellformed output XML wise ! 63695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: This may also result in multiple files being generated 63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: using IObuf, the result encoding used will be the one used for 63715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * creating the output buffer, use the following macro to read it 63725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from the stylesheet 63735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XSLT_GET_IMPORT_PTR(encoding, style, encoding) 63745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: using SAX, any encoding specified in the stylesheet will be lost 63755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * since the interface uses only UTF8 63765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 63775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the number of bytes written to the main resource or -1 in case of 63785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * error. 63795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 63805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 63815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltRunStylesheet(xsltStylesheetPtr style, xmlDocPtr doc, 63825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char **params, const char *output, 63835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlSAXHandlerPtr SAX, xmlOutputBufferPtr IObuf) 63845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 63855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltRunStylesheetUser(style, doc, params, output, SAX, IObuf, 63865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, NULL)); 63875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 63885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 63905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltRegisterAllElement: 63915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: the XPath context 63925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Registers all default XSLT elements in this context 63945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 63955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 63965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltRegisterAllElement(xsltTransformContextPtr ctxt) 63975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 63985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "apply-templates", 63995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltApplyTemplates); 64015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "apply-imports", 64025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltApplyImports); 64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "call-template", 64055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltCallTemplate); 64075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "element", 64085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltElement); 64105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "attribute", 64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltAttribute); 64135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "text", 64145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltText); 64165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "processing-instruction", 64175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltProcessingInstruction); 64195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "comment", 64205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltComment); 64225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "copy", 64235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltCopy); 64255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "value-of", 64265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltValueOf); 64285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "number", 64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltNumber); 64315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "for-each", 64325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltForEach); 64345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "if", 64355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltIf); 64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "choose", 64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltChoose); 64405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "sort", 64415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltSort); 64435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "copy-of", 64445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltCopyOf); 64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "message", 64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltMessage); 64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Those don't have callable entry points but are registered anyway 64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "variable", 64545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltDebug); 64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "param", 64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltDebug); 64595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "with-param", 64605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltDebug); 64625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "decimal-format", 64635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltDebug); 64655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "when", 64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltDebug); 64685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "otherwise", 64695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltDebug); 64715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltRegisterExtElement(ctxt, (const xmlChar *) "fallback", 64725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_NAMESPACE, 64735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xsltTransformFunction) xsltDebug); 64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6476