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